Как сделать 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;
 // right mouse button
 if Msg.LParamHi = 516 then
 Msg.Result:= MA_NOACTIVATEANDEAT;
 // insert code here for show own context menu
 except
 end;
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 - происходит, когда открывается новое окно браузера.
Я, конечно, много чего упустил - например, работу с интерфейсами, доступ к тегам страницы - но надеюсь, эта статья и пример помогут вам сделать работоспособный браузер для дальнейших экспериментов. Успехов!
WEB-сайт: http://search3i.al.ru/
Author: Лозовюк Александр
Source: Взято с http://delphiworld.narod.ru
ID: 03471
Category:Связь
Category:WebBrowser
Category:Статьи
Category:Справочники