Використання компонента TWebBrowser, Інтернет та Мережі, Статті, Програмування - Програмування
Базові операції
Щоб використовувати TWebBrowser у своїй програмі, слід розмістити на формі відповідний компонент, що є на закладці Internet. Потім, щоб відобразити в ньому сторінки HTML, необхідно викликати його метод Navigate:
Розглянемо докладніше параметри, що передаються методу Navigate.
Інші параметри є обов'язковими і є передачі додаткової інформації (табл. 1).
Найцікавішим є параметр PostData, що дозволяє передати на Web-сервер дані, отримані в результаті заповнення форми, якщо сервер вимагає HTTP — транзакції POST. Так, наступний фрагмент коду передає на сервер ім'я користувача та пароль, заповнені у формі Delphi:
Наприклад, на Web-сервері цей запит може бути оброблений наступним ASP-скриптом:
Після того, як дані отримані, необхідно надати користувачеві можливість роботи з ними. Багато функцій TWebBrowser доступні через метод ExecWB, що надає простий спосіб звернення до інтерфейсу IOleCommandTarget. Цей метод має такий вигляд:
CmdID може бути однією із констант OLECMDID, визначених у файлі ShDocVw.pas.
Параметр cmdexecopt може набувати одне з чотирьох значень, наведених у табл. 2.
Параметри pvaIn та pvaOut є додатковими та залежать від конкретної команди.
Є можливість запросити у TWebBrowser доступність тієї чи іншої команди за допомогою функції:
Функція повертає бітову маску із значень, наведених у табл. 3.
Отже, можна налаштовувати інтерфейс залежно від можливостей, що підтримуються поточною версією TWebBrowser:
Для друку вмісту TWebBrowser використовується команда OLECMDID_PRINT. Метод друкуможе виглядати, зокрема, так:
Блок try … except … end необхідний тому, що TWebBrowser при виконанні будь-якої команди за допомогою ExecWB генерує виключення EOleException з кодом:
Починаючи з Internet Explorer 5, документовані додаткові команди, що підтримуються через інтерфейс IOleCommandTarget. Вони значно розширюють можливості з керування компонентом, проте недоступні чи документовані у версії 4. Це створює певні складнощі під час програмування. Так, щоб організувати пошук всередині завантаженої сторінки, потрібен наступний код:
Використання недокументованого виклику в даному випадку є виправданим, оскільки у версії 4 цей виклик вже не буде змінюватися, а у версії 5 ми виявляємо та використовуємо документований метод. У той же час IE4 поки що досить поширений, так що недоцільно повністю позбавляти програму можливості пошуку на таких комп'ютерах.
Тонка настройка
Якщо потрібно більш тонке налаштування компонента, необхідно реалізувати інтерфейс IDocHostUIHandler, що дозволяє програмісту взяти під контроль поведінку TWebBrowser.
Інтерфейс оголошено як:
Спадкоємець TWebBrowser, що реалізує цей інтерфейс, має бути оголошено так:
Тут можна завантажити код такого компонента, що реалізує мінімальну функціональність. Ви можете використовувати його як основу для створення розширених спадкоємців TWebBrowser.
А тепер розглянемо найцікавіші, з погляду програміста, методи інтерфейсу IDocHostUIHandler.
Почнемо з методу ShowContextMenu:
Ця функція викликається у разі, коли TWebBrowser має показати контекстне меню. Якщо ви відображаєте власне меню або хочете придушити меню, функція повиннаповернути S_OK, а якщо меню має показати TWebBrowser - то S_FALSE.
У функцію передаються такі параметри:
1. DwID — ідентифікатор меню, який може приймати одне з таких значень:
Залежно від значення ідентифікатора можна вивести відповідне меню.
2. ppt – координати, в яких має бути показане меню.
3. pcmdtReserved - інтерфейс IOleCommandTarget, що дозволяє запросити стан команд та їх виконання.
4. pdispReserved - інтерфейс IDispatch об'єкта, для якого викликається меню.
Найпростіша реалізація цього може виглядати так:
Для повної заборони контекстного меню метод завжди повинен повертати S_OK.
Наступний метод, який ми розглянемо - GetHostInfo:
Програма може заповнити структуру pInfo, визначену як:
Тут dwFlags - бітова маска з наступних прапорів, наведених у таблиці. 4
, а dwDoubleClick задає реакцію на подвійне клацання мишею і може приймати одне із значень, наведених у табл. 5.
Метод повинен повернути S_OK або код помилки OLE.
Наприклад, щоб створити вікно з плоскими смугами прокручування та без тривимірної рамки, необхідно реалізувати цей метод таким чином:
дозволяє перехопити виконання команд та обробку «гарячих» клавіш та замінити її на свою.
дозволяє встановити шлях у реєстрі, який TWebBrowser буде використовувати для зберігання налаштувань. Це дає можливість, зокрема, зробити компонент, що використовується в програмі, незалежним від поточних налаштувань Internet Explorer.
Шлях повинен утримуватись у ключі реєстру HKEY_CURRENT_USER.
Типова реалізація цього може виглядати так:
Існує ряд налаштувань, які, незважаючи на наявність оброблювачаGetOptionKeyPath, у будь-якому випадку беруть із стандартних параметрів Internet Explorer. Найбільш важливими з них є колонтитули, що використовуються під час друку. У версіях Internet Explorer до 5.5 включно єдиним способом змінити (або придушити) колонтитули є запис нових значень ключ реєстру:
перед печаткою та відновлення їх після друку.
А тепер поговоримо про метод
Він дозволяє повернути покажчик на реалізований у вашому додатку інтерфейс IDispatch, який буде доступний для скриптів у TWebBrowser. Якщо ви не реалізуєте цей інтерфейс, параметр ppDispatch повинен бути встановлений рівним NIL. Метод повертає S_OK у разі успіху або код помилки OLE у разі помилки.
Методи цього інтерфейсу доступні зі скриптів, які виконують у TWebBrowser так:
Реалізувати IDispatch можна, наприклад, за допомогою класу TAutoObject.
Метод TranslateURL дозволяє змінити URL-адресу, за якою здійснюється завантаження сторінки.
pchURLIn вказує на рядок, який містить вихідну URL-адресу. Якщо ваша програма здійснює трансляцію, вона повинна виділити пам'ять під нове значення, використовуючи функцію CoTaskMemAlloc, заповнити буфер новим значенням URL і повернути S_OK.
В іншому випадку ви повинні присвоїти ppchURLOut значення NIL і повернути S_FALSE. У разі виникнення помилки метод повинен повернути OLE-код помилки.
Обробник викликається лише при інтерактивному переході за посиланням з TWebBrowser і не викликається під час переходу за допомогою методу Navigate.
Доступ до документної моделі TWebBrowser
В Internet Explorer реалізовано розширення HTML, що називається Dynamic HTML (DHTML). Ця модель представляє всі елементи HTML-документа як набору колекцій об'єктів, доступних зміни. Скрипти,вбудовані в сторінки та програми, які мають доступ до цих колекцій, можуть знаходити та змінювати їх елементи, а також додавати нові, причому зміни будуть негайно відображені у вікні TWebBrowser. Ієрархічне об'єктне уявлення HTML-об'єктів називається DOM (Document Object Model).
Програмісту DOM в елементі керування IE ActiveX доступна у вигляді набору COM-інтерфейсів. Відправною точкою для доступу до неї є властивість:
Ця властивість забезпечує доступ до інтерфейсу IHtmlDocument2, що дозволяє працювати з вмістом документа. Для отримання інтерфейсу необхідно запитати його за допомогою оператора as:
Документ DOM є набір колекцій елементів. Для доступу до колекції служить інтерфейс IHtmlElementCollection, а елемент колекції — IHtmlElement. Наступний приклад виводить усі теги, наявні в поточному документі та текст усередині тегів:
Крім того, можливе динамічне створення документів у пам'яті, без необхідності запису їх на диск та виклику методу Navigate з протоколом “file://”
Проілюструємо роботу з документною моделлю TWebBrowser на конкретному прикладі. Розташуємо на формі компоненти TWebBrowser, TMemo та три TButton, а потім створимо наступні обробники подій:
У Memo1.Lines запишемо такий текст:
Отже, ми отримали можливість динамічно створювати HTML-документи та надавати їх користувачеві.