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 - одно окно (один экземпляр браузера) и контекстное меню Project2 - Запуск

Для навигации по всем страницам этого раздела сайта используйте иконку меню или ссылку Навигация в строке навигации.

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.

  • «Lazarus fpCEF3» - Главная страница раздела
  • Учебные проекты
  • project1 - первый запуск
  • project2 - один объект (окно) и контекстное меню
  • project3 - веб-интерфейс для десктопного приложения
  • Справочная информация по fpCEF3
  • TChromium Options - опции компонента TChromium
  • TChromium Events - обработка событий Chromium
  •  
  • Vcorp.ru - Главная страница сайта
  • Тест больших гридов в перемещаемых окнах
  • Тестирование 3D графики в браузерах
  • «VcorpJS» - Главная страница раздела
  • «Vcorp Generator» - Главная страница раздела
  • Открывать окно навигации
    <<<
    Изменить высоту >>