使用 CEF4Delphi 从 firemonkey 显示网页
Using CEF4Delphi to show web page from firemonkey
我正在使用 Delphi 10.2 Tokyo 并且我安装了 CEF4Delphi 因为我认为普通的 TWebBrowser 组件在性能和功能方面似乎有点落后。
我正在做的项目是显示网页,不需要显示任何URL地址。所以我只需要显示网页即可。
我发现了一些 VCL 应用程序演示,包括 CEF4Delphi,它们使用另一个 TChromiumWindow 或类似的东西来显示网页。而且 Demos 只有一个(AFAIK)FMX 应用程序示例,带有屏幕外渲染以显示在 TFMXBufferPanel 中。
我尝试了从 Demos 创建表单的确切方法,将 URL 和 AddObject 加载到主布局,但只显示来自演示项目的橙色屏幕,或显示访问冲突错误。我可能不知道如何正确阅读 API 文件,我找不到它。
我从 google 中搜索与 CEF4Delphi 和 FMX 相关的所有内容,但这些都已过时,来自 DCEF3 时代或 FMX 之前的 Delphi。如果没有解决方案,我准备放弃并使用VCL。
我的结论,
我可以使用 CEF4 从 Firemonkey 加载网页吗Delphi?只需要加载网页即可。
如果上述问题可行,我是否也可以截屏打印网页以获取副本或保存为pdf?我觉得这些用一两行源代码就可以搞定
我会post我的工作我试过了。对一些评论的代码表示歉意,我的老板试过了。
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.
是的。您可以使用 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。
我正在使用 Delphi 10.2 Tokyo 并且我安装了 CEF4Delphi 因为我认为普通的 TWebBrowser 组件在性能和功能方面似乎有点落后。
我正在做的项目是显示网页,不需要显示任何URL地址。所以我只需要显示网页即可。
我发现了一些 VCL 应用程序演示,包括 CEF4Delphi,它们使用另一个 TChromiumWindow 或类似的东西来显示网页。而且 Demos 只有一个(AFAIK)FMX 应用程序示例,带有屏幕外渲染以显示在 TFMXBufferPanel 中。
我尝试了从 Demos 创建表单的确切方法,将 URL 和 AddObject 加载到主布局,但只显示来自演示项目的橙色屏幕,或显示访问冲突错误。我可能不知道如何正确阅读 API 文件,我找不到它。
我从 google 中搜索与 CEF4Delphi 和 FMX 相关的所有内容,但这些都已过时,来自 DCEF3 时代或 FMX 之前的 Delphi。如果没有解决方案,我准备放弃并使用VCL。
我的结论,
我可以使用 CEF4 从 Firemonkey 加载网页吗Delphi?只需要加载网页即可。
如果上述问题可行,我是否也可以截屏打印网页以获取副本或保存为pdf?我觉得这些用一两行源代码就可以搞定
我会post我的工作我试过了。对一些评论的代码表示歉意,我的老板试过了。
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.
是的。您可以使用 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。