Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Praktika_03_12_2014_1 (2).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
824.86 Кб
Скачать

Использование компонента tWebBrowser Анатолий Тенцер

Базовые операции

Тонкая настройка

Доступ к документной модели TWebBrowser

 

Во многих современных программах необходимо работать с данными в формате HTML. В качестве средства для просмотра таких данных в Delphi применяется компонент TWebBrowser, который использует элемент управления ActiveX WebBrowser, входящий в состав Microsoft Internet Explorer. Таким образом, этот компонент имеется на любом компьютере, на котором установлен Internet Explorer. Все последние версии Windows содержат TWebBrowser в своем составе и без него практически неработоспособны.

Базовые операции

Для того чтобы использовать TWebBrowser в своей программе, следует разместить на форме соответствующий компонент, имеющийся на закладке Internet. Затем, для отображения в нем страницы HTML, необходимо вызвать его метод Navigate:

procedure TForm1.Button1Click(Sender: TObject); var Flags, TargetFrameName, PostData, Headers: OleVariant; begin WebBrowser1.Navigate(‘http://www.borland.com’, Flags, TargetFrameName, PostData, Headers); end;

Рассмотрим подробнее параметры, передаваемые в метод Navigate.

Первым параметром является строка с URL, указывающим адрес, из которого должна осуществляться загрузка. Поддерживаются все протоколы, доступные в IE, например file:// — загрузка файла, res:// — загрузка из ресурса.

Остальные параметры не являются обязательными и служат для передачи дополнительной информации (табл. 1).

Наиболее интересным является параметр PostData, позволяющий передать на Web-сервер данные, полученные в результате заполнения формы, если этот сервер требует HTTP — транзакции POST. Так, следующий фрагмент кода передает на сервер имя пользователя и пароль, заполненные в форме Delphi:

var LoginDialog: TLoginDialog; Flags, TargetFrameName, PostData, Headers: OleVariant; S: String; ... with TLoginDialog.Create(Application) do try if ShowModal = mrOk then begin S := Format(‘UserName=%s&Password=%s’, _ [Edit1.Text, Edit2.Text]); PostData := VarArrayCreate([1, _ Length(S) + 1], varByte); System.Move(S[1], VarArrayLock(PostData)^, _ Length(S) + 1); VarArrayUnlock(PostData); Headers := ‘Content-Type: application/x-www-form-urlencoded’#10#13; WebBrowser1.Navigate(‘http://intranetserver/secretpage’, Flags, TargetFrameName, PostData, Headers); end; finally Free; end;

Например, на Web-сервере этот запрос может быть обработан, следующим ASP-скриптом:

Dim sConnect Dim sUserName Dim sPassword sUserName = Request.Form(“User”) sPassword = Request.Form(“Pass”) sConnect = “Provider=SQLOLEDB.1;Persist Security Info=True;” & _ “Initial Catalog=Katren;Data Source=DBSERVER;” & _ “Password=” & sPassword & _ “;User ID=” & sUserName Session(“ConnectString”) = sConnect

После того как данные получены, необходимо предоставить пользователю возможность работы с ними. Многие функции TWebBrowser доступны через метод ExecWB, предоставляющий простой способ обращения к интерфейсу IOleCommandTarget. Этот метод имеет такой вид:

procedure TWebBrowser.ExecWB( cmdID: OLECMDID; // Идентификатор команды cmdexecopt: OLECMDEXECOPT; // Параметры выполнения var pvaIn, // Дополнительные параметры, pvaOut: OleVariant // зависящие от команды ); safecall;

CmdID может быть одной из констант OLECMDID, определенных в файле ShDocVw.pas.

Параметр cmdexecopt может принимать одно из четырех значений, приведенных в табл. 2.

Параметры pvaIn и pvaOut являются дополнительными и зависят от конкретной команды.

Имеется возможность запросить у TWebBrowser доступность той или иной команды при помощи функции:

function TWebBrowser.QueryStatusWB(

cmdID: OLECMDID // Идентификатор команды

): OLECMDF; safecall;

Функция возвращает битовую маску из значений, приведенных в табл. 3.

Следовательно, можно настраивать интерфейс в зависимости от поддерживаемых текущей версией TWebBrowser возможностей:

var Flags: OLECMDF; ... Flags := WebBrowser1.QueryStatusWB(OLECMDID_COPY); ActionCopy.Visible := (Flags and OLECMDF_SUPPORTED) = OLECMDF_SUPPORTED; ActionCopy.Enabled := (Flags and OLECMDF_ENABLED) = OLECMDF_ENABLED;

Для печати содержимого TWebBrowser служит команда OLECMDID_PRINT. Метод печати может выглядеть, в частности, следующим образом:

procedure TForm1.ActionPrintExecute(Sender: TObject); var A, B: OleVariant; UserAction: Cardinal; begin if Sender = ActionPrintWithSetup then UserAction := OLECMDEXECOPT_PROMPTUSER else UserAction := OLECMDEXECOPT_DONTPROMPTUSER; try WebBrowser1.ExecWB(OLECMDID_PRINT, UserAction, A, B); except end; end;

Блок try … except … end необходим по той причине, что TWebBrowser при выполнении любой команды при помощи ExecWB генерирует исключение EOleException с кодом:

-2147221248 ($80040100) Trying to revoke _ a drop target that has not been registered.

Начиная с Internet Explorer 5 документированы дополнительные команды, поддерживаемые через интерфейс IOleCommandTarget. Они существенно расширяют возможности по управлению компонентом, однако недоступны либо не документированы в версии 4. Это создает определенные сложности при программировании. Так, чтобы организовать поиск внутри загруженной страницы, необходим следующий код:

const // Недокументированная константа CGID_IE4: TGUID = ‘{ed016940-bd5b-11cf-ba4e-00c04fd70816}’; // Документировано в IE5 SDK CGID_MSHTML: TGUID = ‘{DE4BA900-59CA-11CF-9592-444553540000}’; IDM_FIND = 67;

procedure TForm1.ActionFindExecute(Sender: TObject); var A, B: OleVariant; Target: IOleCommandTarget; OleCmd: TOLECMD; begin // Получаем интерфейс IOleCommandTarget Target := wbMain.Document as IOLECommandtarget; with OleCmd do begin cmdId := IDM_FIND; cmdf := 0; end; // Запрашиваем, поддерживается ли команда Target.QueryStatus(@CGID_MSHTML, 1, @OleCmd, NIL); if (OleCmd.cmdf and OLECMDF_SUPPORTED) = OLECMDF_SUPPORTED then // Да, у нас IE5+, поэтому вызываем документированным способом Target.Exec(@CGID_MSHTML, IDM_FIND, OLECMDEXECOPT_DODEFAULT, A, B) else // Нет, у нас IE4, поэтому вызываем недокументированным способом Target.Exec(@CGID_IE4, 1, OLECMDEXECOPT_DODEFAULT, A, B); end;

Использование недокументированного вызова в данном случае оправданно, так как в версии 4 этот вызов уже не будет изменяться, а в версии 5 мы обнаруживаем и используем документированный метод. В то же время IE4 пока еще достаточно распространен, так что будет нецелесообразно полностью лишать программу возможности поиска на таких компьютерах.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]