You've already forked CEF4Delphi
mirror of
https://github.com/salvadordf/CEF4Delphi.git
synced 2025-07-12 22:30:17 +02:00
.github
bin
demos
Delphi_FMX_Linux
Delphi_FMX_Mac
Delphi_FMX_Windows
Delphi_VCL
ConsoleBrowser
ConsoleBrowser2
CookieVisitor
CustomResourceBrowser
DLLBrowser
DOMVisitor
DualBrowser
EditorBrowser
ExternalPumpBrowser
FullScreenBrowser
JavaScript
KioskOSRBrowser
MDIBrowser
MDIExternalPumpBrowser
MediaRouter
MiniBrowser
MiniBrowserD7
MobileBrowser
NetworkTrackerBrowser
OAuth2Tester
OSRExternalPumpBrowser
PopupBrowser
PopupBrowser2
PostInspectorBrowser
ResponseFilterBrowser
SchemeRegistrationBrowser
SimpleBrowser
SimpleBrowser2
SimpleExternalPumpBrowser
SimpleOSRBrowser
SimpleServer
SubProcess
TabbedBrowser
TabbedBrowser2
TabbedOSRBrowser
TinyBrowser
TinyBrowser2
ToolBoxBrowser
00-DeleteDCUs.bat
ToolBoxBrowser.dpr
ToolBoxBrowser.dproj
uChildForm.dfm
uChildForm.pas
uMainForm.dfm
uMainForm.pas
ToolBoxBrowser2
ToolBoxSubProcessBrowser
URLRequest
VirtualUIBrowser
WebpageSnapshot
WindowsServiceBrowser
Lazarus_Linux_Console
Lazarus_Linux_GTK2
Lazarus_Linux_GTK3
Lazarus_Mac
Lazarus_Windows
Lazarus_any_OS
docs
packages
source
tools
.gitignore
Delphinus.Info.json
Delphinus.Install.json
LICENSE.md
README.md
update_CEF4Delphi.json
218 lines
5.0 KiB
ObjectPascal
218 lines
5.0 KiB
ObjectPascal
unit uMainForm;
|
|
|
|
{$I ..\..\..\source\cef.inc}
|
|
|
|
interface
|
|
|
|
uses
|
|
{$IFDEF DELPHI16_UP}
|
|
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
|
|
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
|
|
{$ELSE}
|
|
Windows, Messages, SysUtils, Variants, Classes, Graphics,
|
|
Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
|
|
{$ENDIF}
|
|
|
|
const
|
|
CEFBROWSER_CREATED = WM_APP + $100;
|
|
CEFBROWSER_CHILDDESTROYED = WM_APP + $101;
|
|
CEFBROWSER_DESTROY = WM_APP + $102;
|
|
CEFBROWSER_INITIALIZED = WM_APP + $103;
|
|
|
|
type
|
|
TMainForm = class(TForm)
|
|
ButtonPnl: TPanel;
|
|
Edit1: TEdit;
|
|
Button1: TButton;
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure Button1Click(Sender: TObject);
|
|
procedure FormShow(Sender: TObject);
|
|
private
|
|
// Variables to control when can we destroy the form safely
|
|
FCanClose : boolean; // Set to True when all the child forms are closed
|
|
FClosing : boolean; // Set to True in the CloseQuery event.
|
|
|
|
procedure CreateToolboxChild(const ChildCaption, URL: string);
|
|
procedure CloseAllChildForms;
|
|
function GetChildClosing : boolean;
|
|
function GetChildFormCount : integer;
|
|
|
|
protected
|
|
procedure ChildDestroyedMsg(var aMessage : TMessage); message CEFBROWSER_CHILDDESTROYED;
|
|
procedure CEFInitializedMsg(var aMessage : TMessage); message CEFBROWSER_INITIALIZED;
|
|
|
|
public
|
|
function CloseQuery: Boolean; override;
|
|
|
|
property ChildClosing : boolean read GetChildClosing;
|
|
property ChildFormCount : integer read GetChildFormCount;
|
|
end;
|
|
|
|
var
|
|
MainForm: TMainForm;
|
|
|
|
procedure CreateGlobalCEFApp;
|
|
|
|
implementation
|
|
|
|
{$R *.dfm}
|
|
|
|
uses
|
|
uChildForm, uCEFApplication;
|
|
|
|
// Destruction steps
|
|
// =================
|
|
// 1. Destroy all child forms
|
|
// 2. Wait until all the child forms are closed before closing the main form.
|
|
|
|
procedure GlobalCEFApp_OnContextInitialized;
|
|
begin
|
|
if (MainForm <> nil) and MainForm.HandleAllocated then
|
|
PostMessage(MainForm.Handle, CEFBROWSER_INITIALIZED, 0, 0);
|
|
end;
|
|
|
|
procedure CreateGlobalCEFApp;
|
|
begin
|
|
GlobalCEFApp := TCefApplication.Create;
|
|
GlobalCEFApp.OnContextInitialized := GlobalCEFApp_OnContextInitialized;
|
|
end;
|
|
|
|
procedure TMainForm.CreateToolboxChild(const ChildCaption, URL: string);
|
|
var
|
|
TempChild : TChildForm;
|
|
begin
|
|
TempChild := TChildForm.Create(self);
|
|
TempChild.Caption := ChildCaption;
|
|
TempChild.Homepage := URL;
|
|
TempChild.Show;
|
|
end;
|
|
|
|
procedure TMainForm.FormCreate(Sender: TObject);
|
|
begin
|
|
FCanClose := False;
|
|
FClosing := False;
|
|
end;
|
|
|
|
procedure TMainForm.CloseAllChildForms;
|
|
var
|
|
i : integer;
|
|
TempComponent : TComponent;
|
|
begin
|
|
i := pred(ComponentCount);
|
|
|
|
while (i >= 0) do
|
|
begin
|
|
TempComponent := Components[i];
|
|
|
|
if (TempComponent <> nil) and
|
|
(TempComponent is TChildForm) and
|
|
not(TChildForm(Components[i]).Closing) then
|
|
PostMessage(TChildForm(Components[i]).Handle, WM_CLOSE, 0, 0);
|
|
|
|
dec(i);
|
|
end;
|
|
end;
|
|
|
|
function TMainForm.GetChildClosing : boolean;
|
|
var
|
|
i : integer;
|
|
TempComponent : TComponent;
|
|
begin
|
|
Result := false;
|
|
i := pred(ComponentCount);
|
|
|
|
while (i >= 0) do
|
|
begin
|
|
TempComponent := Components[i];
|
|
|
|
if (TempComponent <> nil) and
|
|
(TempComponent is TChildForm) then
|
|
begin
|
|
if TChildForm(Components[i]).Closing then
|
|
begin
|
|
Result := True;
|
|
exit;
|
|
end
|
|
else
|
|
dec(i);
|
|
end
|
|
else
|
|
dec(i);
|
|
end;
|
|
end;
|
|
|
|
function TMainForm.GetChildFormCount : integer;
|
|
var
|
|
i : integer;
|
|
TempComponent : TComponent;
|
|
begin
|
|
Result := 0;
|
|
i := pred(ComponentCount);
|
|
|
|
while (i >= 0) do
|
|
begin
|
|
TempComponent := Components[i];
|
|
|
|
if (TempComponent <> nil) and
|
|
(TempComponent is TChildForm) then
|
|
inc(Result);
|
|
|
|
dec(i);
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.Button1Click(Sender: TObject);
|
|
begin
|
|
CreateToolboxChild('Browser', Edit1.Text);
|
|
end;
|
|
|
|
procedure TMainForm.ChildDestroyedMsg(var aMessage : TMessage);
|
|
begin
|
|
// If there are no more child forms we can destroy the main form
|
|
if FClosing and (ChildFormCount = 0) then
|
|
begin
|
|
FCanClose := True;
|
|
PostMessage(Handle, WM_CLOSE, 0, 0);
|
|
end;
|
|
end;
|
|
|
|
function TMainForm.CloseQuery: Boolean;
|
|
begin
|
|
if FClosing or ChildClosing then
|
|
Result := FCanClose
|
|
else
|
|
begin
|
|
FClosing := True;
|
|
|
|
if (ChildFormCount = 0) then
|
|
Result := True
|
|
else
|
|
begin
|
|
Result := False;
|
|
Edit1.Enabled := False;
|
|
Button1.Enabled := False;
|
|
|
|
CloseAllChildForms;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.CEFInitializedMsg(var aMessage : TMessage);
|
|
begin
|
|
Caption := 'ToolBox Browser';
|
|
ButtonPnl.Enabled := True;
|
|
cursor := crDefault;
|
|
end;
|
|
|
|
procedure TMainForm.FormShow(Sender: TObject);
|
|
begin
|
|
if (GlobalCEFApp <> nil) and GlobalCEFApp.GlobalContextInitialized then
|
|
begin
|
|
Caption := 'ToolBox Browser';
|
|
ButtonPnl.Enabled := True;
|
|
cursor := crDefault;
|
|
end;
|
|
end;
|
|
|
|
end.
|