Как сделать WebBrowser средствами Delphi 5
|
Мы с ней попробовали все ласки, все скорости и все позы.
...Потом она ушла в офф-лайн.
|
Читая и перечитывая вопросы и
ответы на Круглом столе сайта Королевство
Дельфи я все время натыкался на вопросы о
компоненте 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 - происходит, когда
открывается новое окно браузера.
Я, конечно, много чего упустил -
например, работу с интерфейсами, доступ к
тегам страницы - но надеюсь, эта статья и
пример помогут вам сделать работоспособный
браузер для дальнейших эксперементов.
Успехов!
http://www.matrix-wb.h1.ru/
- Новое поколение выбирает... MatrixWB.
Скачать проект (откомпилировано в Delphi 5):
|