0

我正在使用 Delphi 10.2 Tokyo 并安装了 CEF4Delphi,因为我认为普通的 TWebBrowser 组件在性能和功能方面似乎有点下降。

我正在做的项目是显示网页,不需要显示任何 URL 地址。所以我只需要显示网页。

我发现了一些 VCL 应用程序演示,包括 CEF4Delphi,它们使用另一个 TChromiumWindow 或类似的东西来显示网页。而且演示中只有一个(AFAIK)FMX 应用程序示例,带有离屏渲染以显示在 TFMXBufferPanel 中。

我尝试了从 Demos 创建表单、加载 URL 和 AddObject 到主布局的确切方法,但只显示来自演示项目的橙色屏幕,或显示访问冲突错误。我可能不知道如何正确阅读 API 文档,我找不到它。

我从谷歌搜索所有与 CEF4Delphi 和 FMX 相关的东西,但这些东西已经过时了,从 DCEF3 或 FMX 之前的 Delphi 时代开始。如果没有解决方案,我将放弃并使用 VCL。

我的结论,

  1. 我可以使用 CEF4Delphi 从 Firemonkey 加载网页吗?只需要加载网页。

  2. 如果上述问题是可能的,我是否也可以拍摄屏幕快照并打印网页以获取其副本或保存为 pdf?我认为这些都可以用一两行源代码来完成。

我会发布我尝试过的工作。为一些注释代码道歉,我的老板尝试过。

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts,
  FMX.Controls.Presentation, FMX.StdCtrls, uFMXExternalPumpBrowser;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Layout1: TLayout;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  f: TFMXExternalPumpBrowserFrm;
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Layout1.AddObject(f.Panel1);
end;

procedure TForm1.Button2Click(Sender: TObject);
//var
//  MainFrame: ICefFrame;
begin

f.Show;
  f.LoadURL('naver.com');
//  f.Panel1.InvalidatePanel;
//
//  f.chrmosr.Browser.MainFrame.LoadUrl('naver.com');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  f := TFMXExternalPumpBrowserFrm.Create(nil);
end;

end.

这是程序执行代码。

program fmxwebtes;

uses
  System.StartUpCopy,
  FMX.Forms,
  WinApi.Windows,
  uCEFApplication,
  Unit1 in 'Unit1.pas' {Form1},
  uFMXApplicationService in 'uFMXApplicationService.pas',
  uFMXExternalPumpBrowser in 'uFMXExternalPumpBrowser.pas' {FMXExternalPumpBrowserFrm};

{$R *.res}

{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}
begin

GlobalCEFApp := TCefApplication.Create;

  if GlobalCEFApp.StartMainProcess then
    begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end;

  GlobalCEFApp.Free;
end.
4

1 回答 1

1

是的。您可以使用 FMX 组件使用 CEF4Delphi 加载、拍摄快照和打印网页,但该演示使用离屏渲染模式 (OSR) 和外部消息泵,这意味着它是 CEF4Delphi 中最复杂的演示之一。

要加载网页,请使用 TFMXChromium.LoadURL。要打印,请使用 TFMXChromium.Print 或 TFMXChromium.PrintToPDF。要拍摄快照,请使用 TFMXBufferPanel.SaveToFile 或复制 TFMXBufferPanel.Buffer 属性中的位图。

如果您使用 VCL 组件,则将浏览器添加到您的应用程序会容易得多。

编辑:您的 DPR 缺少使 FMX 组件工作所需的几个属性。查看 FMXExternalPumpBrowser 演示中的 DPR 文件,您会发现您需要创建工作调度程序并设置这些 GlobalCEFApp 属性。GlobalCEFApp_OnScheduleMessagePumpWork 过程在 uFMXExternalPumpBrowser.pas 中定义

GlobalFMXWorkScheduler := TFMXWorkScheduler.Create(nil);

GlobalCEFApp                            := TCefApplication.Create;
GlobalCEFApp.WindowlessRenderingEnabled := True;
GlobalCEFApp.EnableHighDPISupport       := True;
GlobalCEFApp.FlashEnabled               := False;
GlobalCEFApp.ExternalMessagePump        := True;
GlobalCEFApp.MultiThreadedMessageLoop   := False;
GlobalCEFApp.OnScheduleMessagePumpWork  := GlobalCEFApp_OnScheduleMessagePumpWork;

编辑 2:所有 CEF 组件都需要在加载网站之前进行初始化。您无法在创建组件后立即加载 URL,但您可以设置 TFMXChromium.DefaultUrl 属性以在初始化后立即加载您的 URL。

于 2018-04-13T06:57:32.620 回答