Рейтинг:  5 / 5

Звезда активнаЗвезда активнаЗвезда активнаЗвезда активнаЗвезда активна
 

Решил немного отойти от темы баз данных. И перейти в другое русло разработки, а именно в веб. Понадобилось для одного проекта сделать просмотрщик html страниц, попробовал компоненты для отображения html, оно конечно показывает, но не настолько хорошо как хотелось бы. Если на странице используются разные стили то отображение хромает, опять же с html5  у них проблема.  Поэтому обратил свой взор в сторону компонентов webbrowser для Lazarus'а. Так будет проще и лучше. Опять же поддержка веб стандартов получше  будет.

 

 У Delphi есть компонент TWebBrowser на базе ослика. И его возможностей  вполне хватает. Но вот для Lazarus'a такого компонента по умолчанию нет. Поэтому полез в веб искать что то путевое. Поиск удался. Среди найденного выделялись два компонента.  

GeckoPort

Chromium Embedded Framework (CEF)

Решил использовать второй. Скачать его можно тут.  Следует обратить на версию СEF с которой будет работать данный компонент. На момент написания статьи это была версия 3.2454 это позволит потом избежать некоторых ошибок.

cef github

В о общем скачиваем исходники компонента. Распаковываем архив в какую либо папку. Я для это создал папку на диске С c:\lcl , и распаковал туда архив с исходником. Затем открываем Lazarus и выбираем пункт меню Пакет - Открыть файл пакета (.lpk) 

lazarus memu packet

В появившемся диалоге выбора файла переходим в каталог куда у вас  распакован код компонента и выбираем cef.lpk.

cef lpk

Появится окно установки пакета. В нем нажимаем сначала кнопку Компилировать, а затем выбираем Использовать - Установить.

cef packet install

Появится окно с  предложение пересобрать среду разработки.

ide build

Нажимаем Да и наблюдаем процесс компилирования разработки. 

После этого на палитре компонентов появляется вкладка Chromium.

 panel components

Теперь идем сюда и переходив  в  раздел  Branch 2454 и скачиваем Test App для windows 32, если у вас другая версия операционной системы и среды Lazarus, то скачиваете под свою версию.

cef git branch

Это набор библиотек необходимый для функционирования нашего браузера.  Его содержимое необходимо скопировать в папку, куда у вас будет компилировать ваше приложение.

Теперь создаем новое приложение. У меня получилось такое.

lazarus webbrowser

Я добавил на форму компонент TСhromium, пару кнопок, и pagetab с двумя страницами. На одной разместил  TСhromium, а на второй разместил TSynEdit (компонент с подсветкой синтаксиса),  где будет отображаться исходный код страницы. А дальше написал не много кода для работы. Да и еще что бы все работа в раздел uses добавьте следующие юниты.

uses
...... cef3lcl, cef3lib, cef3types,
  cef3intf, cef3own, gettext, cef3gui, cef3ref, cef3api;

 А теперь по работе с компонентом.

 

Код загрузки страницы.

procedure TForm1.btnGoClick(Sender: TObject);
begin
  Chromium.Load(edurl.Text);
end;

 Если требуется использовать при работе Cookie файлы то код немного видоизменяется. 

 

procedure TForm1.btnGoClick(Sender: TObject);
var
  CookMan: ICefCookieManager;
  CookPath: string;
  CefBack: ICefCompletionCallback;
begin
  CookPath := ExtractFilePath(Application.ExeName) + 'Cookies\octopus'; //задаем путь к "печенькам"
  ForceDirectoriesUTF8(CookPath); // если пути нет то создаем его
  CookMan := TCefCookieManagerRef.Global(CefBack); // подключаемся с менеджеру печенек
  CookMan.SetStoragePath(CookPath, True,CefBack);// устанавливаем пусть к нашему хранилищу
  Chromium.Load(edurl.Text); // грузим страницу
end; 

 После этого если вы допустим войдете на сайт через форму входа и нажмете запомнить на сайте, затем закроете программу и откроете снова то вы автоматически войдет на сайт.

Код получения html исходника страницы. По интернету гуляет кусок кода для работы с Chromium на Delphi,

procedure StringVisitor(const str: ustring);
begin
  form1.SynEdit1.Text := Utf8ToAnsi(str);
end;

function GetSourceHTML: string;
var
  CefStringVisitor: ICefStringVisitor;
begin
  CefStringVisitor := TCefFastStringVisitor.Create(StringVisitor);
  form1.Chromium.Browser.MainFrame.GetSource(CefStringVisitor);
end;                          

procedure TForm1.btnSourceClick(Sender: TObject);
begin
  GetSourceHTML;
end;

для Lazarus он тоже подойдет. Но при компилирование будет выдаваться ошибка

Error: Wrong number of parameters specified for call to "StringVisitor" 

Что бы её убрать в самом начале кода поменяйте директиву

{$mode objfpc}{$H+}

на 

{$mode Delphi}{$H+}

И все нормально скомпилируется.

Пример получения подстветки кода сайта.

 synedit colored

Если требуется отобразить адрес страницы то можно использовать такой код.

procedure TForm1.ChromiumAddressChange(Sender: TObject; const Browser: ICefBrowser;
  const Frame: ICefFrame; const url: ustring);
begin
  form1.Caption := 'Octopus-[' + url + ']';
end;

Так же меня интересовала работа с проксей у данного компонента, но к сожалению как сделать это из кода я не нашел. Но есть возможность запускать программу с передачей ей команды. Делается это так.

programma.exe --proxy-server=127.0.0.1:80

Это позволяет соблюдать некую анонимность в сети.

Пример работы через проксю.

work with proxy

Вот такой простой пример  по работе с Chromium.

 

Комментарии   
0 #2 Воля 20.08.2021 16:05
Последняя доступная версия компонента не компилируется в Lazarus
cef3ref.pas(157 8,1) Error: Local variables size exceeds supported limit
Цитировать
+1 #1 Павел 23.02.2021 06:06
Пока добрался до статьи уже нету сайта где эти исходники есть. А те что есть не работают Грустно.
Цитировать
Добавить комментарий