Как сделать WebBrowser средствами Delphi
Как сделать WebBrowser средствами Delphi
Как сделать WebBrowser средствами Delphi. Читая и перечитывая вопросы и ответы на Круглом столе сайта Королевство Дельфи я все время натыкался на вопросы о компоненте TWebBrowser. Сначала я думал, что все просто, но когда самому понадобилось написать приложение с использованием TwebBrowser: оказалось, что не все так просто! Эта статья не претендует на исчерпывающие руководство по написанию браузера в Delphi 5 - скорее всего она будет со временем дополняться и исправляться. Я постарался обобщить в одном работающем примере решения большинства вопросов, заданных на этом сайте (признаюсь, там были и мои). Также выражаю большую признательность Елене Филлиповой за исчерпывающие ответы на некоторые из них, и всему Королевству за столь хороший и полезный сайт. Компонент TWebBrowser в Delphi 4 нужно было специально инсталлировать как Active X компонент. В 5-й версии нам пошли навстречу, и он сразу есть на вкладке Internet. Не буду останавливаться на особенностях интерфейса программы - он очень прост (надеюсь, не очень) и не вызовет трудностей. Рассмотрим некоторые свойства и функции TwebBrowser. procedure GoBack; procedure GoForward; procedure GoHome; procedure GoSearch; procedure Refresh; procedure Stop; procedure Quit; Названия этих процедур говорят сами за себя, а позволяют они осуществить управление просмотром - перейти по истории просмотра вперед, назад, перейти на страницу, установленную как домашняя, открыть страницу поиска, обновить текущую страницу, остановить загрузку страницы, выйти. Последняя команда самая интересная - в Help написано, что использовать ее не надо. Она завершает работу IE и очищает окно. Но я проверял - вроде вреда от ее использования не наблюдалось. Далее идет целая группа процедур: procedure Navigate(const URL: WideString); overload; procedure Navigate(const URL: WideString; var Flags: OleVariant); overload; procedure Navigate(const URL: WideString; var Flags: OleVariant; var TargetFrameName: OleVariant); overload; procedure Navigate(const URL: WideString; var Flags: OleVariant; var TargetFrameName: OleVariant; var PostData: OleVariant); overload; procedure Navigate(const URL: WideString; var Flags: OleVariant; var TargetFrameName: OleVariant; var PostData: OleVariant; var Headers: OleVariant); overload; Все они предназначены для указания того, какая и как страница должна отображаться в браузере. В простейшем случае можно использовать первую процедуру procedure Navigate(const URL: WideString); Например так: WebBrowser1.Navigate(' http://delphi.vitpc.com/'); Или WebBrowser1.Navigate(' http://delphi.vitpc.com/',empty,empty,empty,empty) Для значения Flag определены такие константы: navOpenInNewWindow 1 Открывает URL в новом окне браузера navNoHistory 2 Не заносит адрес в список History. navNoReadFromCache 4 Не использует сохраненную в кеше страницу, а загружает с сервера. navNoWriteToCache 8 Не записывает страницу в дисковый кеш. navAllowAutosearch 16 Если броузер не может найти указанный домен, он передает его в поисковый механизм. Все, это можно также вручную установить в настройках браузера. TargetFrameName указывает имя фрейма, куда надо загрузить страницу. Если присвоить NULL страница просто загрузиться в текущее окно. PostData - указывает на данные, которые нужно отослать, используя метод HTTP POST. Если установить в NULL, процедура Navigate будет использовать метод HTTP GET. Следующая довольно интересная и полезная процедура procedure ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT); overload; Позволяет осуществить управление браузером и вызывать различные дополнительные функции - печать, сохранение и др. Использует IoleCommandTarget интерфейс для управления браузером. CmdID - задает команду, которую нужно выполнить. Может принимать следующие значения: OLECMDID_OPEN, OLECMDID_NEW, OLECMDID_SAVE, OLECMDID_SAVEAS, OLECMDID_SAVECOPYAS, OLECMDID_PRINT, OLECMDID_PRINTPREVIEW, OLECMDID_PAGESETUP, OLECMDID_SPELL, OLECMDID_PROPERTIES, OLECMDID_CUT, OLECMDID_COPY, OLECMDID_PASTE, OLECMDID_PASTESPECIAL, OLECMDID_UNDO, OLECMDID_REDO, OLECMDID_SELECTALL, OLECMDID_CLEARSELECTION, OLECMDID_ZOOM, OLECMDID_GETZOOMRANGE, OLECMDID_UPDATECOMMANDS, OLECMDID_REFRESH, OLECMDID_STOP, OLECMDID_HIDETOOLBARS, OLECMDID_SETPROGRESSMAX , OLECMDID_SETPROGRESSPOS, OLECMDID_SETPROGRESSTEXT, OLECMDID_SETTITLE, OLECMDID_SETDOWNLOADSTATE, OLECMDID_STOPDOWNLOAD, OLECMDID_FIND, OLECMDID_ONTOOLBARACTIVATED, OLECMDID_DELETE, OLECMDID_HTTPEQUIV, OLECMDID_ENABLE_INTERACTION, OLECMDID_HTTPEQUIV_DONE, OLECMDID_ONUNLOAD, OLECMDID_PROPERTYBAG2, OLECMDID_PREREFRESH Если присмотреться, то можно увидеть, что некоторые из них дублируються процедурами Stop, Refresh и др. Но большенство очень даже нужные. Cmdexecopt - указывает дополнительно, как команда должна исполняться. Может принимать значения: OLECMDEXECOPT_DODEFAULT 0 Команда исполняеться так, как принято по умолчанию. OLECMDEXECOPT_PROMPTUSER 1 Перед выполнением выводиться окно диалога или дополнительных настроек. OLECMDEXECOPT_DONTPROMPTUSER 2 Не задаеться никаких вопросов. OLECMDEXECOPT_SHOWHELP 3 Выводиться справка по запрошеному действии, но сама команда не выполняеться. Удобно для вызова из вашего приложения справки по IE. Вызивать эту комманду желательно и даже нужно в блоке try WebBrowser1.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER); except end; Эта команда вызивает диалоговое окно печати документа. Если же опустить try:except, то при нажатии "Отмена" в этом окне будет сгенерировано уведомление об ошибке типа: raised exception class EOleException with message "Невозможно установить свойство coISpan. Недопустимое значения свойства. Требуется ввести значение от 1 до 1000". Теперь поговорим о свойствах. PopupMenu; Как оконный элемент управления, TwebBrowser поддерживает всплывающие меню. НО! Ваше меню будет появляться только пока в браузер не загружена страница. Дальше - только меню IE. В Конференции предложили такой вариант для запрета появления стандартного меню ... private { Private declarations } procedure WMMouseActivate(var Msg: TMessage); message WM_MOUSEACTIVATE; public { Public declarations } end; ... procedure TForm1.WMMouseActivate(var Msg: TMessage); begin try inherited; //правая кнопка мышки ? if Msg.LParamHi = 516 then Msg.Result:= MA_NOACTIVATEANDEAT; // Тут можно вставить код для показания своего меню except end; property OffLine : WordBool; Позволяет загружать документы из локального кеша - если присвоить True. property LocationURL: WideString; Позначено как "только для чтения" и содержит URL ресурса, загруженого в браузер. Теперь события. Среди самых важных/нужных есть: OnDownloadBegin OnDownloadComplete OnBeforeNavigate2 OnNewWindow2 OnNavigateComplete2 OnDocumentComplete OnDownloadBegin - происходит, когда вы, наберя URL, хотите перейти по нему. Тут можно задать например анимацию или ProgressBar для индикации процесса загрузки страницы ( совмесно с OnProgressChange). OnDownloadComplete, OnDownloadComplete, OnNavigateComplete2 - происходит, когда страница закончила грузиться. Правда, здесь есть много нюансов при загрузке страниц с графикой и фреймами - для каждого загружаемого элемента будут генерироваться новые события начала/окончания загрузки, а кроме того, если отключить загрузку рисунков/анимации/видео, так вообще некоторые из них не будут происходить! Так что пользоваться ими нужно осторожно. OnBeforeNavigate2 - происходит когда вы переходите по щелчку на гиперссылке из основной страницы, загруженной в браузер. Сюда можно писать код, который например, анализирует - куда пользователь переходит, и соответственно, что-то делать. Или запретить открывание новых окно, или открывать свои окна (типа сделать TtabbedNotebook c IE на каждой странице) OnNewWindow2 - происходит, когда открывается новое окно браузера. Я, конечно, много чего упустил - например, работу с интерфейсами, доступ к тегам страницы - но надеюсь, эта статья и пример помогут вам сделать работоспособный браузер для дальнейших эксперементов. Успехов! Лозовюк Александр e-mail: aleks_3i@mail.ru