Всем привет! Сегодня, я хочу вам рассказать как написать свой браузер на делфи. Сделать это достаточно не трудно - было бы желание.. Начнем:
Браузер мы будем создавать конечно же на базе компонента - WebBrowser (Internet).
Кидаем на форму: Один компонент WebBrowser со вкладки Internet , 13-шт компонентов SpeedButton, 1- компонент ComboBox, 1 - компонент Panel, 1 - компонент ProgressBar, 1 - компонент StatusBar, 1 - компонент OpenDialog и 1 - компонент SaveDialog. Разместим их на форме примерно следующим образом:
[Ссылки могут видеть только зарегистрированные пользователи. ]
в uses подключим MSHTML и ActiveX
Далее создаем событие OnCreate на форме и записываем в нем следующий код:
Код:
begin
WebBrowser1.Navigate('http://www.google.com');
end;
Кстати, вместе google.com можно вводить любой адрес страницы. (Любая страница, которую вы бы хотели видеть при старте).
Давайте теперь пропишем кнопку "вперед". Kнопку, которую будем нажимать после ввода адреса в ComboBox. Для этого:
Создадим событие OnClick на SpeedButton6 например, и в коде напишем:
Код:
var
a:string;
begin
WebBrowser1.Navigate(ComboBox1.Text); // Передаем в поиск, введенный адрес из ComboBox1;
a:=ComboBox1.text; // Записываем параллельно этот адрес в переменную;
ComboBox1.Items.Add(a); // Загружаем введенное в список ComboBox1;
end;
Заморочка с помещением введенного адреса в выпадающий список, будет позволять нам при нажатии на СomboBox, просматривать историю вводимых вручную адресов, в строку браузера.
Что нужно делать далее? - Далее для нашего с вами удобства сделаем так, чтобы наш механизм работал не только от SpeedButton6 но и от нажатия нами на клавишу Enter, для этого:
Создаем событие OnKeyPress, y компонента ComboBox1 запишем следующее:
Код:
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:
Код:
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:
Код:
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 на SpeedButton4 пишем;
Код:
begin
WebBrowser1.Stop;
end;
8) Для обновления странички в OnClick на SpeedButton3 пишем;
Код:
begin
WebBrowser1.Refresh;
end;
Все сделали? Переходим к следующему: пропишем еше ряд батонов, придав нашему приложению дополнительную функциональность.
Например, обеспечим открытие файлов в нашем браузере расположенных на локальных дисках.
Для этого в OnClick на SpeedButton7 пишем:
Код:
begin
if OpenDialog1.Execute then
begin
WebBrowser1.Navigate(OpenDialog1.FileName);
ComboBox1.Text:=OpenDialog1.FileName;
end;
end;
Для возможности нашего браузера также сохранять странички на компьютер, в OnClick на SpeedButton9 пишем:
Для получения возможности печати по нажатию на SpeedButton8 в OnClick последнего пропишем:
Код:
var
PostData, Headers: OLEvariant;
begin
WebBrowser1.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DODEFAULT, PostData, Headers); //Печатаем содержимое TWebBrowser;
end;
Для предварительного просмотра странички перед печатью, в OnClick на SpeedButton10 пишем:
Код:
begin
WebBrowser1.ExecWB(OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DODEFAULT); //Предварительный просмотр;
end;
А для предварительной настройки ее параметров, в OnClick на SpeedButton11 пишем:
Код:
begin
WebBrowser1.ExecWB(OLECMDID_PAGESETUP, OLECMDEXECOPT_DODEFAULT); //Параметры страницы;
end;
Теперь организуем поиск слов на страничке, и в OnClick на SpeedButton12 пишем:
Код:
begin
WebBrowser1.ExecWB(OLECMDID_FIND, OLECMDEXECOPT_DODEFAULT); //Поиск слов на сайте;
end;
Для сохранения исходного кода в текстовый файл, нужно:
а) В разделе Public записываем следующую процедуру:
Код:
procedure SaveHTMLSourceToFile(const FileName: string; WB: TWebBrowser); //процедура сохранения Url;
б) Жмем Ctrl+Shift+C;
в) В сгенерированном автоматически шаблоне TForm1.SaveHTMLSourceToFile(const FileName: string; WB: TWebBrowser);
прописываем:
Код:
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:
Код:
begin
if SaveDialog1.Execute then
SaveHTMLSourceToFile(SaveDialog1.FileName, WebBrowser1);
end;
Так же давайте настроим режим уведомления об успешных загрузках документов, для этого в свойстве OnDocumentComplete компонента WebBrowser1, нужно прописать следующее:
Код:
begin
if URL=WebBrowser1.LocationURL Then
begin
ShowMessage('Документ успешно загружен');
end;
end;
Чтобы ProgressBar1 отображал ход загрузки страниц, в свойстве OnProgressChange компонента WebBrowser1, нужно прописать:
Увидел компонент WebBrowser и перестал читать дальше...ибо это такой же тормозной аналог IE
Вот если бы ты использовал что то другое вместо wb то было бы на много интереснее!!!
________________
[Ссылки могут видеть только зарегистрированные пользователи. ]
[Ссылки могут видеть только зарегистрированные пользователи. ]
Создаем новый проект в среде Delphi VCL Forms Application. На форму кидаем TChromeTabs и присваиваем ему выравнивание по верхнему краю (align:=alTop). Далее добавляем "адресную строку", для этого будем использовать компонент - TEdit. Кидаем его на форму и присваиваем ему выравнивание по верхнему краю (align:=alTop). Стираем содержимое свойства Text и присваиваем содержимое по умолчанию (TextHint:=’Paste [Ссылки могут видеть только зарегистрированные пользователи. ]). Получиться должно что то вроде этого:
[Ссылки могут видеть только зарегистрированные пользователи. ]
Сейчас, это все компоненты, которые нам нужны. TChromium будем создавать
динамически.
Подключение модулей TChromium:
Прежде всего, нам нужно подключить модуль cefvcl.pas. В нем у нас с вами находится декларация класса TChromium. Компонент требует несколько DLL-библиотек, которые должны лежать в папке проекта, либо же в папке Windows. Копировать их все в папку с проектом смысла нет, так что давайте попробуем заставить TChromium загружать свои библиотеки из папки, в которую он был установлен при интеграции в среду Delphi.
Для этого подключаем модуль ceflib.pas и присваиваем необходимый путь переменной CefLibrary. Для этого достаточно в секции инициализации переназначить эту переменную:
Теперь при запуске проекта библиотеки будут грузиться из папки D:\DComponents\dcef3\bin\Win32\. Кстати очень удобный прием, его смело можно добавлять в каждый ваш проект — незачем плодить копии одних и тех же библиотек.
Сам Браузер:
Раскидываем компоненты по форме. Далее мы будем создавать экземпляры TChromium прямо на форме, а в зависимости от активного таба выводить определенный экземпляр на передний план методом BringToFront. Табы и экземпляры браузера связаны одинаковым свойством Tag, которое будем генерировать при создании таба.
Добавляем нашей форме поле ActiveChromium (будет хранить ссылку на экземпляр активного в данный момент браузера)
Добавляем форме метод для создания экземпляра TChromium:
Код:
procedure TForm1.CreateChromium; var browser:tchromium; begin browser:=tchromium.Create(form1); browser.Parent:=form1; browser.Align:=alclient; browser.Tag:=random(10000); activechromium:=browser; with chrometabs1.Tabs.Add do begin caption:='Новая вкладка'; tag:=browser.tag; end; edit1.Text:=''; end;
Этим методом мы создаем экземпляр класса TChromium, распологаем его на форме, генерируем рандомный тег, присваиваем ActiveChromium созданный экземпляр. Создаем таб, тегу которого присваиваем такой же, как и у TChromium, а заголовку — Новая вкладка. Обнуляем значение адресной строки. Для более надежной генерации случайных чисел, добавим в секцию инициализации процедуру Randomize:
Код:
initialization randomize;
Создаем вкладки
Создаем обработчик событий табов ButtonAddClick. Он будет вызываться всякий раз, когда пользователь щелкнет на кнопку добавления вкладки:
Код:
procedure TForm1.ChromeTabs1ButtonAddClick(Sender: TObject; var Handled: Boolean); begin handled:=true; createChromium; end;
В этом обработчике указываем handled:=true по той простой причине, что нет нужды создавать вкладку автоматически. Она будет создана в методе CreateChromium. Запускаем приложение, добавляем вкладку с помощью хромовского плюсика (по умолчанию сам плюсик не отображается, чтобы его показать, нужно присвоить ChromeTabs1. Options.Display. Addbutton. ShowPlusSign:=true). Как вы уже увидели при нажатии на кнопку добавления создается вкладка Новая вкладка и компонент TChromium.
Добавляем этот метод в обработчик создания формы. Тогда при запуске приложения одна вкладка будет создаваться автоматически:
Код:
procedure TForm1.FormCreate(Sender: TObject); begin createChromium; end;
Переход по адресу:
Добавим обработку адреса. Для этого создадим простой обработчик:
Код:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if key=#13 then begin chrometabs1.ActiveTab.Caption:=edit1.Text; activechromium.Load(edit1.Text); end; end;
Снова запускаем приложение и вводим в адресную строку адрес «yandex.ru«, нажмите Enter и убедитесь, что компонент загружает страничку Яндекса.
[Ссылки могут видеть только зарегистрированные пользователи. ]
Поиск TChromium на форме:
Следующие, что мы должны сделать - это написать метод поиска экземпляра браузера по его тегу:
Код:
function TForm1.FindChromium(atag: integer): tchromium; var i:integer; begin result:=nil; for I := 0 to form1.ControlCount-1 do if form1.Controls[i] is tchromium then if (form1.Controls[i] as tchromium).Tag=atag then result:=form1.Controls[i] as tchromium; end;
Переключение вкладок:
Теперь, когда у нас есть функция поиска экземпляра, мы можем написать обработчик события для переключения вкладок:
Код:
procedure TForm1.ChromeTabs1ActiveTabChanged(Sender: TObject; ATab: TChromeTab); var browser:tchromium; begin browser:=findChromium(atab.Tag); if (browser<>nil) then with browser do begin bringtofront; edit1.Text:=browser.MainFrame.Url; end; end;
Теперь, запустив приложение, вы можете создать несколько вкладок и свободно переключаться между ними. Отображаться будут соответствующие экземпляры браузера.
[Ссылки могут видеть только зарегистрированные пользователи. ]
Освобождение ресурсов:
Создаем обработчик закрытия вкладки:
Код:
procedure TForm1.ChromeTabs1ButtonCloseTabClick(Sender: TObject; ATab: TChromeTab; var Close: Boolean); var browser:tchromium; begin browser:=findChromium(atab.Tag); browser.Free; close:=true; if chrometabs1.Tabs.Count=1 then application.Terminate; end;
В этот обработчик передается экземпляр TChromeTab — вкладка, которая закрывается, и параметр Close, значение которого необходимо определить. Если close:=true — компонент TChromeTabs удаляет вкладку. Иначе он просто не позволит ее закрыть — щелчки по кнопке закрытия будут проигнорированы. Сначала мы ищем соответствующий вкладке экземпляр TChromium. Затем освобождаем его методом Free и присваиваем close:=true — пусть TChromeTabs сам разберется с закрытием вкладки. Также ставим условие — если вкладка была последняя — прерываем выполнение приложения. Tabs.count указано 1 т.к. на момент вызова этой функции как минимум 1 вкладка существует — закрываемая.
ссылку можно ещё на браузер хрома?) пощупать охота)
________________
[Ссылки могут видеть только зарегистрированные пользователи. ]
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). Пишу софт на заказ(Delphi / C# / PHP-скрипты). Описывайте задачи и цели софта, сообщайте сумму на которую рассчитываете.
Skype: vinozavr (Молдова)
Кто плюсует популярность, подписывайтесь пожалуйста)
________________
[Ссылки могут видеть только зарегистрированные пользователи. ]
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). Пишу софт на заказ(Delphi / C# / PHP-скрипты). Описывайте задачи и цели софта, сообщайте сумму на которую рассчитываете.
Skype: vinozavr (Молдова)
Кто плюсует популярность, подписывайтесь пожалуйста)
Он бесплатный, поэтому скачать с официального сайта труда не составит
Кстати, некоторые браузеры выпускаются с открытым исходным кодом, например [Ссылки могут видеть только зарегистрированные пользователи. ]
Реально, на основе IE - браузер получается фиговенький. Так что я решил полазить и нашел компоненты и маленький семпл браузера.
1. Инсталируем пакеты,
2. добавляем пути до папок GeckoSDK и GeckoComponents,
3. Инсталируем .dpk файл из папки GeckoSDK,
4. Инсталим .dpk файл из папки GeckoComponents,
5. Компилим проект Sam~1
Готово. Компоненты и т.п. качаем тут - [Ссылки могут видеть только зарегистрированные пользователи. ]
Извините , возможно за тупой вопрос, но где взять TChromeTabs ?
Или его скачать надо откуда то?
Можно сылre откуда скачать и как его установить на DelphiXE2
Спасибо
________________
[Ссылки могут видеть только зарегистрированные пользователи. ]
[Ссылки могут видеть только зарегистрированные пользователи. ]
Извините , возможно за тупой вопрос, но где взять TChromeTabs ?
Или его скачать надо откуда то?
Можно сылre откуда скачать и как его установить на DelphiXE2
Спасибо
Попробуйте здесь [Ссылки могут видеть только зарегистрированные пользователи. ]
Еще есть компонент Tchromiumtabs - вкладки как у хрома, там куча настроек у них. В общем на делфи вполне можно написать красивый браузер на движке хрома как яндекс браузер, гугл хром и другие. Это не так уж и сложно. Хотя возникали проблемы с этими вкладками. Они то сами по себе переключаются, но не имеют тела. Поэтому если кто будет делать:
Создаете массив tchromium, webbrowser или что вы там используете.
Ну и потом уже работайте через него, просто убирая visible На нужных компонентах из массива.
________________
Тык спасибку если заслужил! Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Он бесплатный, поэтому скачать с официального сайта труда не составит
Кстати, некоторые браузеры выпускаются с открытым исходным кодом, например [Ссылки могут видеть только зарегистрированные пользователи. ]
А есть модуль libcef.dll новее версии 3.2171.1979 ?
а то недавно скачанный dcef3 при простой загрузке страницы ошибку выдает acess violation at 0x.. : read of address 0x00000000 ругаясь на этот модуль
Ребят, подскажите, пожалуйста, а как к опциям обратиться если создаю также динамически?
Т.е. вот если кидаю TChromium на форму, то там в инспекторе объектом понятное дело легко отключить, а вот если создаю динамически, то не могу понять как этим флагам обратиться.