Компонент WebBrowser — пишем свой браузер на Delphi
Создавать браузер мы будем на базе компонента WebBrowser со вкладки палитры компонентов — Internet. Для этого первым делом разместим на форме все самое необходимое…
- Один компонент WebBrowser со вкладки Internet , 13-шт компонентов SpeedButton, 1- компонент ComboBox, 1 — компонент Panel, 1 — компонент ProgressBar, 1 — компонент StatusBar, 1 — компонент OpenDialog и 1 — компонент SaveDialog. Разместим их на форме примерно следующим образом:
- В uses подключаем MSHTML и ActiveX
- Создадим событие OnCreate на форме и запишем в нем следующий код:
1 2 3 |
begin WebBrowser1.Navigate('https://okolokompa.com'); end; |
Вместо okolokompa.ru можно ввести адрес любой страницы, которую бы вы хотели получить при запуске браузера.
Далее пропишем клавишу «Вперед». Кнопку, которую будем нажимать после ввода адреса в ComboBox. Для этого:
- Создадим событие OnClick на SpeedButton6 например, и в коде напишем:
1 2 3 4 5 6 7 |
var a:string; begin WebBrowser1.Navigate(ComboBox1.Text); // Передаем в поиск, введенный адрес из ComboBox1; a:=ComboBox1.text; // Записываем параллельно этот адрес в переменную; ComboBox1.Items.Add(a); // Загружаем введенное в список ComboBox1; end; |
Помещение введенного адреса в выпадающий список, будет позволять нам при нажатии на СomboBox, просматривать историю вводимых вручную адресов, в строку браузера.
Далее для удобства сделаем так, чтобы данный механизм работал не только от SpeedButton6, но и от нажатия нами на клавишу Enter, для этого:
- Создадим событие OnKeyPress y компонента ComboBox1 и запишем следующее:
1 2 3 4 5 6 7 8 9 10 |
var a:string; begin if Key=#13 then begin WebBrowser1.Navigate(ComboBox1.Text); a:=ComboBox1.text; ComboBox1.Items.Add(a); end; end; |
Теперь просматривать страницы можно и по нажатии клавиши Enter.
Далее заставим работать клавиши — шаг назад и шаг вперед.
- Для клавиши — Шаг назад, пишем в событии OnClick у кнопки SpeedButton1:
1 2 3 4 5 6 7 8 9 10 |
var Doc, Histor: Variant; begin Doc:= WebBrowser1.OleObject.document; //Ссылаемся на интерфейс документа; if TVarData(Doc).VDispatch = nil then Exit; //Если документ отсутствует, тогда выходим; Histor:=Doc.parentWindow.history; //Объект документа - объект родительского окна - объект содержащий //историю переходов Шаг назад к предыдущему URL Histor.go(-1); end; |
- Для клавиши — Шаг вперед пишем в событии OnClick у кнопки SpeedButton2:
1 2 3 4 5 6 7 8 9 10 |
var Doc, Histor: Variant; begin Doc:= WebBrowser1.OleObject.document; //Ссылаемся на интерфейс документа; if TVarData(Doc).VDispatch = nil then Exit; //Если документ отсутствует, тогда выходим; Histor:=Doc.parentWindow.history; //Объект документа - объект родительского окна - объект содержащий //историю переходов Шаг вперед к предыдущему URL Histor.go(1); end; |
- Для перехода на домашнюю страницу в OnClick на SpeedButton5 пишем:
1 2 3 |
begin WebBrowser1.GoHome; end; |
- Для остановки загрузки в OnClick на SpeedButton4 пишем:
1 2 3 |
begin WebBrowser1.Stop; end; |
- Для обновления страницы в OnClick на SpeedButton3 пишем:
1 2 3 |
begin WebBrowser1.Refresh; end; |
Итак, мы успешно прописали основные клавиши для работы нашего браузера. Теперь пропишем еще ряд кнопок, придав нашему приложению дополнительную функциональность. Например, обеспечим открытие файлов в нашем браузере расположенных на локальных дисках.
- Для этого в OnClick на SpeedButton7 пишем:
1 2 3 4 5 6 7 |
begin if OpenDialog1.Execute then begin WebBrowser1.Navigate(OpenDialog1.FileName); ComboBox1.Text:=OpenDialog1.FileName; end; end; |
- Для возможности нашего браузера также сохранять странички на компьютер, в OnClick на SpeedButton9 пишем:
1 2 3 4 |
begin //Сохраняем содержимое WebBrowser1 WebBrowser1.ExecWB(OLECMDID_SAVEAS, OLECMDEXECOPT_DODEFAULT); end; |
- Для получения возможности печати по нажатию на SpeedButton8 в OnClick последнего пропишем:
1 2 3 4 5 6 |
var PostData, Headers: OLEvariant; begin //Печатаем содержимое TWebBrowser WebBrowser1.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DODEFAULT, PostData, Headers); end; |
- Для предварительного просмотра странички перед печатью, в OnClick на SpeedButton10 пишем:
1 2 3 4 |
begin //Предварительный просмотр WebBrowser1.ExecWB(OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DODEFAULT); end; |
- А для предварительной настройки ее параметров, в OnClick на SpeedButton11 пишем:
1 2 3 4 |
begin //Параметры страницы WebBrowser1.ExecWB(OLECMDID_PAGESETUP, OLECMDEXECOPT_DODEFAULT); end; |
- Теперь организуем поиск слов на страничке, и в OnClick на SpeedButton12 пишем:
1 2 3 4 |
begin //Поиск слов на сайте WebBrowser1.ExecWB(OLECMDID_FIND, OLECMDEXECOPT_DODEFAULT); end; |
- Чтобы сохранить исходный код в текстовый файл нужно:
а) В разделе Public записываем следующую процедуру:
1 2 |
//процедура сохранения Url; procedure SaveHTMLSourceToFile(const FileName: string; WB: TWebBrowser); |
б) Жмем Ctrl+Shift+C;
в) В сгенерированном автоматически шаблоне TForm1.SaveHTMLSourceToFile(const FileName: string; WB: TWebBrowser) прописываем:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
var PersistStream: IPersistStreamInit; FileStream: TFileStream; Stream: IStream; SaveResult: HRESULT; begin PersistStream := WB.Document as IPersistStreamInit; FileStream := TFileStream.Create(FileName, fmCreate); try Stream := TStreamAdapter.Create(FileStream, soReference) as IStream; SaveResult := PersistStream.Save(Stream, True); if FAILED(SaveResult) then MessageBox(Handle, 'Fail to save HTML source', 'Error', 0); finally FileStream.Free; end; end; |
г) Пишем в OnClick на SpeedButton13:
1 2 3 4 |
begin if SaveDialog1.Execute then SaveHTMLSourceToFile(SaveDialog1.FileName, WebBrowser1); end; |
- Настроим режим уведомления об успешных загрузках документов, для этого в свойстве OnDocumentComplete компонента WebBrowser1, нужно прописать следующее:
1 2 3 4 5 6 |
begin if URL=WebBrowser1.LocationURL Then begin ShowMessage('Документ успешно загружен'); end; end; |
- Чтобы ProgressBar1 отображал ход загрузки страниц, в свойстве OnProgressChange компонента WebBrowser1, нужно прописать:
1 2 3 4 |
begin ProgressBar1.Max:=ProgressMax; ProgressBar1.Position:=Progress; end; |
- Если в событии OnStatusTextChange компонента WebBrowser1, прописать:
1 2 3 |
begin StatusBar1.Panels[0].text:=text; end; |
то URL хода загрузки, будет корректно отображаться в StatusBar;