TChromium control - Initialization issue
Posted: Fri Jul 10, 2020 2:06 pm
Hi,
I am trying to create a small browser utility bu using CEF4 Delphi.
System Information:
It's a real PC and not a virtual machine
Operation System: Windows 10 Enterprise
System Type: 64-bit
Delphi version: Delphi 10 Seattle
Installed CEF4 controls in my developer environment
About Utility:
Utility contains,Main Form & Browser form. Here, i am trying open the browser form by click on "Open Browser" button which is in Main Form.
I am using "class function" to create the browser form and sending URL as parameter.
In browser form, using "LoadURL" to open the web site. Here, "GetInitialized" is always failing due to FBrowserId is 0. Hence page is not loading.
I have placed TButton (GO button) on the same browser form and used "LoadURL" (on Click), surprised....now the LoadURL is working fine and there is no Initialization issue....If i add a simple ShowMessage('Hi') when before calling LoadURL then it works fine.
Still wondering, why working only with Button click and ShowMessage (on the browser form)....and not working when calling from Main Form.
Could you please help me to resolve this issue?
Code:
******************************************************************************Main Form:**************************************************************
unit Main;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TfrmMain = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
uses Browser;
{$R *.dfm}
procedure TfrmMain.Button1Click(Sender: TObject);
var
lURL: string;
begin
lURL:= 'www.google.com';
TfrmBrowser.Execute(lURL);
end;
end.
******************************************************************************Browser Form:**************************************************************
Browser Form:
unit Browser;
{$I cef.inc}
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, uCEFChromiumCore, uCEFChromium,
uCEFWinControl, uCEFWindowParent, uCEFTypes, uCEFInterfaces, uCEFConstants,
uCEFApplication, uCEFStringVisitor, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.ComCtrls,
System.NetEncoding, Vcl.AppEvnts;
type
TfrmBrowser = class(TForm)
CEFWindowParent: TCEFWindowParent;
dLoadTimer: TTimer;
Panel1: TPanel;
Button1: TButton;
dStatusBar: TStatusBar;
dACRChromiumBrowser: TChromium;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure dLoadTimerTimer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure dACRChromiumBrowserLoadError(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; errorCode: Integer;
const errorText, failedUrl: ustring);
procedure dACRChromiumBrowserBeforeContextMenu(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; const model: ICefMenuModel);
procedure dACRChromiumBrowserBeforeBrowse(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame;
const request: ICefRequest; user_gesture, isRedirect: Boolean;
out Result: Boolean);
procedure dACRChromiumBrowserLoadEnd(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame;
httpStatusCode: Integer);
private
{ Private declarations }
fURL: string;
procedure LoadBrowser(aURL: string);
public
{ Public declarations }
class function Execute( aURL: String ): TModalResult;
end;
var
frmBrowser: TfrmBrowser;
implementation
{$R *.dfm}
procedure TfrmBrowser.Button1Click(Sender: TObject);
begin
dACRChromiumBrowser.LoadURL(fURL);
end;
procedure TfrmBrowser.dACRChromiumBrowserBeforeBrowse(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame;
const request: ICefRequest; user_gesture, isRedirect: Boolean;
out Result: Boolean);
begin
dStatusBar.Panels[0].Text := request.Url;
end;
procedure TfrmBrowser.dACRChromiumBrowserBeforeContextMenu(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; const model: ICefMenuModel);
begin
model.Clear;
end;
procedure TfrmBrowser.dACRChromiumBrowserLoadEnd(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; httpStatusCode: Integer);
begin
dStatusBar.Panels[0].Text := 'Done';
end;
procedure TfrmBrowser.dACRChromiumBrowserLoadError(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; errorCode: Integer;
const errorText, failedUrl: ustring);
var
TempString : string;
begin
if (errorCode = ERR_ABORTED) then exit;
TempString := '<html><body bgcolor="white">' +
'<h2>Failed to load URL ' + failedUrl +
' with error ' + errorText +
' (' + inttostr(errorCode) + ').</h2></body></html>';
dACRChromiumBrowser.LoadString(TempString, frame)
end;
procedure TfrmBrowser.dLoadTimerTimer(Sender: TObject);
begin
dLoadTimer.Enabled := False;
if not(dACRChromiumBrowser.CreateBrowser(CEFWindowParent, '')) and
not(dACRChromiumBrowser.Initialized) then
dLoadTimer.Enabled := True;
end;
class function TfrmBrowser.Execute( aURL: String ): TModalResult;
var
lfrmBrowser: TfrmBrowser;
begin
lfrmBrowser := TfrmBrowser.Create(nil);
lfrmBrowser.fURL:= aURL;
try
Result := lfrmBrowser.ShowModal;
finally
FreeAndNil( lfrmBrowser );
end;
end;
procedure TfrmBrowser.FormCreate(Sender: TObject);
begin
dACRChromiumBrowser.MultiBrowserMode := True;
end;
procedure TfrmBrowser.FormShow(Sender: TObject);
begin
try
if not(dACRChromiumBrowser.CreateBrowser(CEFWindowParent, '')) then dLoadTimer.Enabled := True;
if fURL <> '' then
LoadBrowser(fURL);
except
on E: Exception do
begin
end;
end;
end;
procedure TfrmBrowser.LoadBrowser(aURL: string);
begin
dACRChromiumBrowser.LoadURL(aURL, '');
end;
end.
*********************************************************************************DPR***************************************************************************************
program Test_Browser_03;
{$I cef.inc}
uses
Vcl.Forms,
uCEFApplication,
Main in 'Main.pas' {frmMain},
Browser in 'Browser.pas' {frmBrowser};
{$R *.res}
begin
GlobalCEFApp := TCefApplication.Create;
GlobalCEFApp.cache:= 'cache';
if GlobalCEFApp.StartMainProcess then
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end;
GlobalCEFApp.Free;
GlobalCEFApp := nil;
end.
************************************************************************************************************************************************************************
Thanks & Regards,
John Augustine
I am trying to create a small browser utility bu using CEF4 Delphi.
System Information:
It's a real PC and not a virtual machine
Operation System: Windows 10 Enterprise
System Type: 64-bit
Delphi version: Delphi 10 Seattle
Installed CEF4 controls in my developer environment
About Utility:
Utility contains,Main Form & Browser form. Here, i am trying open the browser form by click on "Open Browser" button which is in Main Form.
I am using "class function" to create the browser form and sending URL as parameter.
In browser form, using "LoadURL" to open the web site. Here, "GetInitialized" is always failing due to FBrowserId is 0. Hence page is not loading.
I have placed TButton (GO button) on the same browser form and used "LoadURL" (on Click), surprised....now the LoadURL is working fine and there is no Initialization issue....If i add a simple ShowMessage('Hi') when before calling LoadURL then it works fine.
Still wondering, why working only with Button click and ShowMessage (on the browser form)....and not working when calling from Main Form.
Could you please help me to resolve this issue?
Code:
******************************************************************************Main Form:**************************************************************
unit Main;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TfrmMain = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
uses Browser;
{$R *.dfm}
procedure TfrmMain.Button1Click(Sender: TObject);
var
lURL: string;
begin
lURL:= 'www.google.com';
TfrmBrowser.Execute(lURL);
end;
end.
******************************************************************************Browser Form:**************************************************************
Browser Form:
unit Browser;
{$I cef.inc}
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, uCEFChromiumCore, uCEFChromium,
uCEFWinControl, uCEFWindowParent, uCEFTypes, uCEFInterfaces, uCEFConstants,
uCEFApplication, uCEFStringVisitor, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.ComCtrls,
System.NetEncoding, Vcl.AppEvnts;
type
TfrmBrowser = class(TForm)
CEFWindowParent: TCEFWindowParent;
dLoadTimer: TTimer;
Panel1: TPanel;
Button1: TButton;
dStatusBar: TStatusBar;
dACRChromiumBrowser: TChromium;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure dLoadTimerTimer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure dACRChromiumBrowserLoadError(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; errorCode: Integer;
const errorText, failedUrl: ustring);
procedure dACRChromiumBrowserBeforeContextMenu(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; const model: ICefMenuModel);
procedure dACRChromiumBrowserBeforeBrowse(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame;
const request: ICefRequest; user_gesture, isRedirect: Boolean;
out Result: Boolean);
procedure dACRChromiumBrowserLoadEnd(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame;
httpStatusCode: Integer);
private
{ Private declarations }
fURL: string;
procedure LoadBrowser(aURL: string);
public
{ Public declarations }
class function Execute( aURL: String ): TModalResult;
end;
var
frmBrowser: TfrmBrowser;
implementation
{$R *.dfm}
procedure TfrmBrowser.Button1Click(Sender: TObject);
begin
dACRChromiumBrowser.LoadURL(fURL);
end;
procedure TfrmBrowser.dACRChromiumBrowserBeforeBrowse(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame;
const request: ICefRequest; user_gesture, isRedirect: Boolean;
out Result: Boolean);
begin
dStatusBar.Panels[0].Text := request.Url;
end;
procedure TfrmBrowser.dACRChromiumBrowserBeforeContextMenu(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; const model: ICefMenuModel);
begin
model.Clear;
end;
procedure TfrmBrowser.dACRChromiumBrowserLoadEnd(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; httpStatusCode: Integer);
begin
dStatusBar.Panels[0].Text := 'Done';
end;
procedure TfrmBrowser.dACRChromiumBrowserLoadError(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; errorCode: Integer;
const errorText, failedUrl: ustring);
var
TempString : string;
begin
if (errorCode = ERR_ABORTED) then exit;
TempString := '<html><body bgcolor="white">' +
'<h2>Failed to load URL ' + failedUrl +
' with error ' + errorText +
' (' + inttostr(errorCode) + ').</h2></body></html>';
dACRChromiumBrowser.LoadString(TempString, frame)
end;
procedure TfrmBrowser.dLoadTimerTimer(Sender: TObject);
begin
dLoadTimer.Enabled := False;
if not(dACRChromiumBrowser.CreateBrowser(CEFWindowParent, '')) and
not(dACRChromiumBrowser.Initialized) then
dLoadTimer.Enabled := True;
end;
class function TfrmBrowser.Execute( aURL: String ): TModalResult;
var
lfrmBrowser: TfrmBrowser;
begin
lfrmBrowser := TfrmBrowser.Create(nil);
lfrmBrowser.fURL:= aURL;
try
Result := lfrmBrowser.ShowModal;
finally
FreeAndNil( lfrmBrowser );
end;
end;
procedure TfrmBrowser.FormCreate(Sender: TObject);
begin
dACRChromiumBrowser.MultiBrowserMode := True;
end;
procedure TfrmBrowser.FormShow(Sender: TObject);
begin
try
if not(dACRChromiumBrowser.CreateBrowser(CEFWindowParent, '')) then dLoadTimer.Enabled := True;
if fURL <> '' then
LoadBrowser(fURL);
except
on E: Exception do
begin
end;
end;
end;
procedure TfrmBrowser.LoadBrowser(aURL: string);
begin
dACRChromiumBrowser.LoadURL(aURL, '');
end;
end.
*********************************************************************************DPR***************************************************************************************
program Test_Browser_03;
{$I cef.inc}
uses
Vcl.Forms,
uCEFApplication,
Main in 'Main.pas' {frmMain},
Browser in 'Browser.pas' {frmBrowser};
{$R *.res}
begin
GlobalCEFApp := TCefApplication.Create;
GlobalCEFApp.cache:= 'cache';
if GlobalCEFApp.StartMainProcess then
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end;
GlobalCEFApp.Free;
GlobalCEFApp := nil;
end.
************************************************************************************************************************************************************************
Thanks & Regards,
John Augustine