|
Programming: Delphi
Создание Web-броузера на 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://realcoding.net/');
Или
WebBrowser1.Navigate('
http://realcoding.net/',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; 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 - происходит, когда открывается новое окно
браузера.
Я, конечно, много чего упустил - например, работу с
интерфейсами, доступ к тегам страницы - но надеюсь, эта статья и пример
помогут вам сделать работоспособный браузер для дальнейших эксперементов.
Успехов.
При перепечатке любого материала
с сайта, видимая ссылка на источник www.warayg.narod.ru
и все имена, ссылки авторов обязательны.
© 2005
|
|
|