Lazarus fpCEF3 - Учебный проект 2 - одно окно (один экземпляр браузера) и контекстное меню
Во втором проекте мы запретим создание новых объектов (окон) браузера, открывая все страницы в главном окне, а так-же будем формировать контекстное меню, которое вызывается правой кнопкой мыши на любой веб-странице.
Если вы ещё не подключили fpCEF3, то узнайте как это сделать: подключение веб-браузера в Lazarus.
Так же мы будем использовать функцию DecodeURL() модуля synacode из Synapse (см. подключение Synapse).
Создадим одну форму (главную) размером 600х400 с единственным контролом-компонентом TChromium, который растянем на всю форму:
Anchors: [akTop,akLeft,akRight,akBottom],
На этот раз в инспекторе объектов мы оставим свойство DefaultIrl со значением по-умолчанию «about:blank» и создадим константу MainUrl со значением «https://www.yandex.ru/» (обязательно через «www», иначе авто-редирект в браузере изменит наш стартовый URL)
В файле проекта project2.lpr добавим строку «Form1.Chromium1.Load(MainUrl);» для принудительной установки адреса веб-страницы в нашем браузере (кириллица в MainUrl корректно обрабатывается браузером).
В инспекторе объектов создадим для событий OnBeforeContextMenu и OnBeforePopup собственные процедуры-обработчики.
В обработчике «TForm1.Chromium1BeforePopup» будем возвращать «Result:=True;» чтобы новое окно не открывалось, а новую веб-страницу будем принудительно открывать в текущем окне (фрейме) «frame.LoadUrl(targetUrl);»
В обработчике «TForm1.Chromium1BeforeContextMenu» будем очищать контекстное меню и создавать собственное аналогичное, сверяясь со свойствами браузера.
Используйте функцию Utf8Decode() для избегания «кракозябр» вместо символов кириллицы в контекстном меню.
Различные свойства и методы объектов браузера, фрейма и контекстного меню можно найти в файле cef3intf.pas (соответственно интерфейсы ICefBrowser, ICefFrame, ICefMenuModel).


Для навигации по всем страницам этого раздела сайта используйте иконку меню или ссылку Навигация в строке навигации.
project2.lpr
program project2;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, Unit1
{ you can add units after this };
{$R *.res}
begin
RequireDerivedFormResource := True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Form1.Chromium1.Load(MainUrl);
Application.Run;
end.
unit1.pas
unit Unit1;
interface
{$mode objfpc}{$H+}
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
synacode, cef3lcl, cef3types, cef3intf;
type
{ TForm1 }
TForm1 = class(TForm)
Chromium1: TChromium;
procedure Chromium1BeforeContextMenu(Sender: TObject;
const Browser: ICefBrowser; const Frame: ICefFrame;
const params: ICefContextMenuParams; const model: ICefMenuModel);
procedure Chromium1BeforePopup(Sender: TObject; const browser: ICefBrowser;
const frame: ICefFrame; const targetUrl, targetFrameName: ustring;
targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean;
var popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo;
var client: ICefClient; var settings: TCefBrowserSettings;
var noJavascriptAccess: Boolean; out Result: Boolean);
private
{ private declarations }
public
{ public declarations }
end;
const
MainUrl = 'https://www.yandex.ru/';
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Chromium1BeforePopup(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; const targetUrl,
targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition;
userGesture: Boolean; var popupFeatures: TCefPopupFeatures;
var windowInfo: TCefWindowInfo; var client: ICefClient;
var settings: TCefBrowserSettings; var noJavascriptAccess: Boolean;
out Result: Boolean);
begin
Result := True; // Чтобы новое окно не открывалось
frame.LoadUrl(targetUrl);
{ Form1.Chromium1.Load(targetUrl); // Аналогичный результат }
end;
procedure TForm1.Chromium1BeforeContextMenu(Sender: TObject;
const Browser: ICefBrowser; const Frame: ICefFrame;
const params: ICefContextMenuParams; const model: ICefMenuModel);
begin
model.Clear; // очистим меню и создадим аналогичное
if(Browser.CanGoBack) and (DecodeURL(Frame.Url) <> MainUrl) then
model.AddItem(100,Utf8Decode('&Back (B - предыдущая страница)'));
if(Browser.CanGoForward) then
model.AddItem(101,Utf8Decode('&Forward (F - следующая страница)'));
model.AddSeparator;
model.AddItem(131,Utf8Decode('&Print...'));
model.AddItem(132,Utf8Decode('View s&ource (O - просмотр исходного кода)'));
end;
end.

