From 2ed976d906e89ac5ce0e8c05a2d64d2f0a06e17a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20D=C3=ADaz=20Fau?= Date: Wed, 20 Mar 2019 15:56:14 +0100 Subject: [PATCH] Fix for duplicated resources in FMX apps made by SchneiderInfosystems - The FMX demos now load the initial web page using the TFMXChromium.DefaultUrl property. - Added the $(FrameworkType) conditional define to all the FMX demos. - Added the $(FrameworkType) conditional define to the CEF4Delphi_FMX project. --- .../FMXExternalPumpBrowser.dproj | 9 ++++--- .../uFMXExternalPumpBrowser.pas | 7 ++++- .../FMXToolBoxBrowser/FMXToolBoxBrowser.dproj | 8 +++--- demos/FMXToolBoxBrowser/uChildForm.fmx | 1 - demos/FMXToolBoxBrowser/uChildForm.pas | 15 +---------- .../uFMXApplicationService.pas | 16 ----------- demos/FMXToolBoxBrowser/uMainForm.pas | 19 +++++++++++++ demos/SimpleFMXBrowser/SimpleFMXBrowser.dproj | 8 +++--- demos/SimpleFMXBrowser/uSimpleFMXBrowser.pas | 14 +++++++--- packages/CEF4Delphi_FMX.dpk | 1 + packages/CEF4Delphi_FMX.dproj | 25 ++++++++++++++---- packages/CEF4Delphi_FMX.res | Bin 724 -> 676 bytes source/uCEFApplication.pas | 7 ++++- 13 files changed, 79 insertions(+), 51 deletions(-) diff --git a/demos/FMXExternalPumpBrowser/FMXExternalPumpBrowser.dproj b/demos/FMXExternalPumpBrowser/FMXExternalPumpBrowser.dproj index 6dc0ba34..f77910dd 100644 --- a/demos/FMXExternalPumpBrowser/FMXExternalPumpBrowser.dproj +++ b/demos/FMXExternalPumpBrowser/FMXExternalPumpBrowser.dproj @@ -72,6 +72,7 @@ FMXExternalPumpBrowser 3082 CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(FrameworkType);$(DCC_Define) DBXSqliteDriver;bindcompdbx;fmxase;DBXDb2Driver;DBXInterBaseDriver;vcl;DBXSybaseASEDriver;vclactnband;vclFireDAC;FireDACDb2Driver;DataSnapFireDAC;svnui;tethering;dsnapcon;FireDACADSDriver;FireDACMSAccDriver;fmxFireDAC;DBXMSSQLDriver;vclimg;FireDACInfxDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;Componentes_UI;vcldb;bindcompfmx;svn;FireDACPgDriver;DBXOracleDriver;inetdb;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;CEF4Delphi;DbxCommonDriver;IndyProtocols240;IndySystem240;fmx;DataSnapServer;xmlrtl;DataSnapNativeClient;fmxobj;fmxdae;vclwinx;rtl;FireDACDSDriver;DbxClientDriver;IndyCore240;DBXSybaseASADriver;CustomIPTransport;vcldsnap;dbexpress;FireDACDBXDriver;vclx;bindcomp;appanalytics;dsnap;DataSnapCommon;DBXInformixDriver;bindcompvcl;DataSnapConnectors;VCLRESTComponents;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;vclie;bindengine;DBXMySQLDriver;FireDACOracleDriver;dsnapxml;FireDACMySQLDriver;dbrtl;inetdbxpress;DBXFirebirdDriver;DataSnapProviderClient;FireDACMongoDBDriver;FireDACCommonODBC;DataSnapClient;DataSnapServerMidas;$(DCC_UsePackage) @@ -107,6 +108,7 @@ true 1033 PerMonitor + true true @@ -155,9 +157,10 @@ FMXExternalPumpBrowser.dpr - IP Abstraction Indy Implementation Design Time - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components + IP Abstraction Indy Implementation Design Time + DBExpress Enterprise Data Explorer Integration + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components diff --git a/demos/FMXExternalPumpBrowser/uFMXExternalPumpBrowser.pas b/demos/FMXExternalPumpBrowser/uFMXExternalPumpBrowser.pas index a390cf97..5e1ce053 100644 --- a/demos/FMXExternalPumpBrowser/uFMXExternalPumpBrowser.pas +++ b/demos/FMXExternalPumpBrowser/uFMXExternalPumpBrowser.pas @@ -157,6 +157,11 @@ var // It was necessary to destroy the browser following the destruction sequence described in // the MDIBrowser demo but in OSR mode there are some modifications. +// All FMX applications using CEF4Delphi should add the $(FrameworkType) conditional define +// in the project options to avoid duplicated resources. +// This demo has that define in the menu option : +// Project -> Options -> Building -> Delphi compiler -> Conditional defines (All configurations) + // This is the destruction sequence in OSR mode : // 1- FormCloseQuery sets CanClose to the initial FCanClose value (False) and calls chrmosr.CloseBrowser(True). // 2- chrmosr.CloseBrowser(True) will trigger chrmosr.OnClose and we have to @@ -252,6 +257,7 @@ begin begin // opaque white background color chrmosr.Options.BackgroundColor := CefColorSetARGB($FF, $FF, $FF, $FF); + chrmosr.DefaultUrl := AddressEdt.Text; if chrmosr.CreateBrowser then DoBrowserCreated @@ -857,7 +863,6 @@ begin Caption := 'FMX External Pump Browser'; AddressPnl.Enabled := True; Panel1.SetFocus; - LoadURL; end; function TFMXExternalPumpBrowserFrm.getModifiers(Shift: TShiftState): TCefEventFlags; diff --git a/demos/FMXToolBoxBrowser/FMXToolBoxBrowser.dproj b/demos/FMXToolBoxBrowser/FMXToolBoxBrowser.dproj index 8f07ff9f..9856baa7 100644 --- a/demos/FMXToolBoxBrowser/FMXToolBoxBrowser.dproj +++ b/demos/FMXToolBoxBrowser/FMXToolBoxBrowser.dproj @@ -72,6 +72,7 @@ FMXToolBoxBrowser 3082 CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(FrameworkType);$(DCC_Define) DBXSqliteDriver;DataSnapServerMidas;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;DataSnapFireDAC;svnui;tethering;Componentes;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;Componentes_Int;IndyProtocols240;fmx;fmxdae;FireDACDBXDriver;dbexpress;vclx;dsnap;DataSnapCommon;DataSnapConnectors;VCLRESTComponents;vclie;CEF4Delphi_FMX;bindengine;DBXMySQLDriver;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;DataSnapClient;bindcompdbx;vcl;DBXSybaseASEDriver;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;Componentes_UI;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;DbxCommonDriver;Componentes_Misc;IndySystem240;DataSnapServer;xmlrtl;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;DbxClientDriver;IndyCore240;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;Componentes_RTF;DBXInformixDriver;bindcompvcl;Componentes_vCard;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;fmxase;$(DCC_UsePackage) @@ -162,9 +163,10 @@ FMXToolBoxBrowser.dpr - IP Abstraction Indy Implementation Design Time - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components + IP Abstraction Indy Implementation Design Time + DBExpress Enterprise Data Explorer Integration + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components diff --git a/demos/FMXToolBoxBrowser/uChildForm.fmx b/demos/FMXToolBoxBrowser/uChildForm.fmx index 30f8026b..f9e070fa 100644 --- a/demos/FMXToolBoxBrowser/uChildForm.fmx +++ b/demos/FMXToolBoxBrowser/uChildForm.fmx @@ -19,7 +19,6 @@ object ChildForm: TChildForm DesignerMasterStyle = 0 object FMXChromium1: TFMXChromium OnBeforePopup = FMXChromium1BeforePopup - OnAfterCreated = FMXChromium1AfterCreated OnBeforeClose = FMXChromium1BeforeClose OnClose = FMXChromium1Close Left = 40 diff --git a/demos/FMXToolBoxBrowser/uChildForm.pas b/demos/FMXToolBoxBrowser/uChildForm.pas index 1bd583ad..87c00812 100644 --- a/demos/FMXToolBoxBrowser/uChildForm.pas +++ b/demos/FMXToolBoxBrowser/uChildForm.pas @@ -59,7 +59,6 @@ type procedure FormDestroy(Sender: TObject); procedure FMXChromium1BeforePopup(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const targetUrl, targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; var client: ICefClient; var settings: TCefBrowserSettings; var noJavascriptAccess, Result: Boolean); - procedure FMXChromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); procedure FMXChromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); procedure FMXChromium1Close(Sender: TObject; const browser: ICefBrowser; out Result: Boolean); @@ -78,7 +77,6 @@ type public procedure NotifyMoveOrResizeStarted; - procedure DoBrowserCreated; procedure DoDestroyParent; procedure SendCloseMsg; @@ -141,12 +139,6 @@ begin FMXWindowParent.SetBounds(0, 0, ClientWidth - 1, ClientHeight - 1); end; -procedure TChildForm.FMXChromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); -begin - // Now the browser is fully initialized we can send a message to the main form to load the initial web page. - PostCustomMessage(CEF_AFTERCREATED, 0, BrowserID); -end; - procedure TChildForm.FMXChromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin FCanClose := True; @@ -230,6 +222,7 @@ begin TempRect.Right := round(TempClientRect.Right); TempRect.Bottom := round(TempClientRect.Bottom); + FMXChromium1.DefaultUrl := FHomepage; FMXChromium1.CreateBrowser(TempHandle, TempRect); end; end; @@ -240,12 +233,6 @@ begin if (FMXChromium1 <> nil) then FMXChromium1.NotifyMoveOrResizeStarted; end; -procedure TChildForm.DoBrowserCreated; -begin - // Load the homepage after the browser is fully initialized - if (length(FHomepage) > 0) then FMXChromium1.LoadURL(FHomepage); -end; - procedure TChildForm.DoDestroyParent; begin // We destroy FMXWindowParent safely in the main thread and this will trigger the TFMXChromium.OnBeforeClose event. diff --git a/demos/FMXToolBoxBrowser/uFMXApplicationService.pas b/demos/FMXToolBoxBrowser/uFMXApplicationService.pas index 9431ae83..c25b437c 100644 --- a/demos/FMXToolBoxBrowser/uFMXApplicationService.pas +++ b/demos/FMXToolBoxBrowser/uFMXApplicationService.pas @@ -189,22 +189,6 @@ begin (Application.MainForm is TMainForm) then TMainForm(Application.MainForm).DoChildDestroyed; - CEF_AFTERCREATED : - if not(Application.Terminated) then - begin - i := 0; - - while (i < screen.FormCount) do - if (screen.Forms[i] is TChildForm) and - (TChildForm(screen.Forms[i]).BrowserID = TempMsg.lParam) then - begin - TChildForm(screen.Forms[i]).DoBrowserCreated; - i := screen.FormCount; - end - else - inc(i); - end; - CEF_DESTROY : if not(Application.Terminated) then begin diff --git a/demos/FMXToolBoxBrowser/uMainForm.pas b/demos/FMXToolBoxBrowser/uMainForm.pas index 06ff56c5..0c097f92 100644 --- a/demos/FMXToolBoxBrowser/uMainForm.pas +++ b/demos/FMXToolBoxBrowser/uMainForm.pas @@ -99,6 +99,25 @@ uses FMX.Platform, FMX.Platform.Win, uCEFMiscFunctions, uFMXApplicationService, uChildForm, uCEFApplication; +// This Firemonkey demo shows how to create child windows with browsers using CEF4Delphi. +// It uses a custom IFMXApplicationService to handle Windows messages. + +// The application must not try to create browsers before GlobalCEFApp.GlobalContextInitialized +// is TRUE, which is set in a different thread when the GlobalCEFApp.OnContextInitialized +// event is triggered. +// There are several ways to handle the race between the form creation and the +// GlobalCEFApp.OnContextInitialized event but this demo is using a simple check +// in the TForm.OnShow event. + +// All FMX applications using CEF4Delphi should add the $(FrameworkType) conditional define +// in the project options to avoid duplicated resources. +// This demo has that define in the menu option : +// Project -> Options -> Building -> Delphi compiler -> Conditional defines (All configurations) + +// It's very important to close all the browsers before closing the main form. +// Always follow these destruction steps in your applications to avoid +// crashes when it's closed. Read the code comments in uChildForm.pas + // Main form destruction steps // =========================== // 1. Destroy all child forms diff --git a/demos/SimpleFMXBrowser/SimpleFMXBrowser.dproj b/demos/SimpleFMXBrowser/SimpleFMXBrowser.dproj index 05fa66ce..b1b574b2 100644 --- a/demos/SimpleFMXBrowser/SimpleFMXBrowser.dproj +++ b/demos/SimpleFMXBrowser/SimpleFMXBrowser.dproj @@ -72,6 +72,7 @@ SimpleFMXBrowser 3082 CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(FrameworkType);$(DCC_Define) DBXSqliteDriver;bindcompdbx;fmxase;DBXDb2Driver;DBXInterBaseDriver;vcl;DBXSybaseASEDriver;vclactnband;vclFireDAC;FireDACDb2Driver;DataSnapFireDAC;svnui;tethering;dsnapcon;FireDACADSDriver;FireDACMSAccDriver;fmxFireDAC;DBXMSSQLDriver;vclimg;FireDACInfxDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;FireDACPgDriver;DBXOracleDriver;inetdb;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;DbxCommonDriver;IndyProtocols240;IndySystem240;fmx;DataSnapServer;xmlrtl;DataSnapNativeClient;fmxobj;fmxdae;vclwinx;rtl;FireDACDSDriver;DbxClientDriver;IndyCore240;DBXSybaseASADriver;CustomIPTransport;vcldsnap;dbexpress;FireDACDBXDriver;vclx;bindcomp;appanalytics;dsnap;DataSnapCommon;DBXInformixDriver;bindcompvcl;DataSnapConnectors;VCLRESTComponents;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;vclie;CEF4Delphi_FMX;bindengine;DBXMySQLDriver;FireDACOracleDriver;dsnapxml;FireDACMySQLDriver;dbrtl;inetdbxpress;DBXFirebirdDriver;DataSnapProviderClient;FireDACMongoDBDriver;FireDACCommonODBC;DataSnapClient;DataSnapServerMidas;$(DCC_UsePackage) @@ -158,9 +159,10 @@ SimpleFMXBrowser.dpr - IP Abstraction Indy Implementation Design Time - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components + IP Abstraction Indy Implementation Design Time + DBExpress Enterprise Data Explorer Integration + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components diff --git a/demos/SimpleFMXBrowser/uSimpleFMXBrowser.pas b/demos/SimpleFMXBrowser/uSimpleFMXBrowser.pas index de122575..3514f576 100644 --- a/demos/SimpleFMXBrowser/uSimpleFMXBrowser.pas +++ b/demos/SimpleFMXBrowser/uSimpleFMXBrowser.pas @@ -62,8 +62,6 @@ type procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormShow(Sender: TObject); - procedure FMXChromium1AfterCreated(Sender: TObject; - const browser: ICefBrowser); procedure FMXChromium1Close(Sender: TObject; const browser: ICefBrowser; out Result: Boolean); procedure FMXChromium1BeforeClose(Sender: TObject; @@ -77,6 +75,8 @@ type var settings: TCefBrowserSettings; var noJavascriptAccess, Result: Boolean); procedure FormResize(Sender: TObject); + procedure FMXChromium1AfterCreated(Sender: TObject; + const browser: ICefBrowser); protected // Variables to control when can we destroy the form safely @@ -118,6 +118,11 @@ implementation // This demo uses a TFMXChromium and a TFMXWindowParent. // TFMXApplicationService is used to handle custom Windows messages +// All FMX applications using CEF4Delphi should add the $(FrameworkType) conditional define +// in the project options to avoid duplicated resources. +// This demo has that define in the menu option : +// Project -> Options -> Building -> Delphi compiler -> Conditional defines (All configurations) + // Destruction steps // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TFMXChromium.CloseBrowser which triggers the TFMXChromium.OnClose event. @@ -128,7 +133,8 @@ uses FMX.Platform, FMX.Platform.Win, uCEFMiscFunctions, uCEFApplication, uFMXApplicationService; -procedure TSimpleFMXBrowserFrm.FMXChromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); +procedure TSimpleFMXBrowserFrm.FMXChromium1AfterCreated(Sender: TObject; + const browser: ICefBrowser); begin // Now the browser is fully initialized we can send a message to the main form to load the initial web page. PostCustomMessage(CEF_AFTERCREATED); @@ -247,6 +253,7 @@ begin TempRect.Right := round(TempClientRect.Right); TempRect.Bottom := round(TempClientRect.Bottom); + FMXChromium1.DefaultUrl := AddressEdt.Text; if not(FMXChromium1.CreateBrowser(TempHandle, TempRect)) then Timer1.Enabled := True; end; end; @@ -284,7 +291,6 @@ begin // Now the browser is fully initialized Caption := 'Simple FMX Browser'; AddressPnl.Enabled := True; - LoadURL; end; procedure TSimpleFMXBrowserFrm.DoDestroyParent; diff --git a/packages/CEF4Delphi_FMX.dpk b/packages/CEF4Delphi_FMX.dpk index 06d8bb8c..38e04802 100644 --- a/packages/CEF4Delphi_FMX.dpk +++ b/packages/CEF4Delphi_FMX.dpk @@ -24,6 +24,7 @@ package CEF4Delphi_FMX; {$MINENUMSIZE 1} {$IMAGEBASE $400000} {$DEFINE RELEASE} +{$DEFINE $(FrameworkType)} {$ENDIF IMPLICITBUILDING} {$IMPLICITBUILD OFF} diff --git a/packages/CEF4Delphi_FMX.dproj b/packages/CEF4Delphi_FMX.dproj index ce354589..db17ac50 100644 --- a/packages/CEF4Delphi_FMX.dproj +++ b/packages/CEF4Delphi_FMX.dproj @@ -5,7 +5,7 @@ 18.5 VCL True - Debug + Release Win32 3 Package @@ -34,6 +34,12 @@ true true + + true + Cfg_1 + true + true + true Base @@ -75,6 +81,10 @@ false false false + $(FrameworkType);$(DCC_Define) + 3082 + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + ..\source;$(DCC_UnitSearchPath) rtl;vcl;fmx;$(DCC_UsePackage) @@ -100,6 +110,11 @@ true true + + true + 1033 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + false RELEASE;$(DCC_Define) @@ -303,10 +318,10 @@ CEF4Delphi_FMX.dpk - File C:\Users\Public\Documents\Embarcadero\Studio\19.0\Bpl\DCLComponentes_UI.bpl not found - IP Abstraction Indy Implementation Design Time - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components + IP Abstraction Indy Implementation Design Time + DBExpress Enterprise Data Explorer Integration + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components diff --git a/packages/CEF4Delphi_FMX.res b/packages/CEF4Delphi_FMX.res index 391381f9dc4de3bb832da06585491df01ab8693f..934cad8709e937bbd616193ea1577b71e39c0962 100644 GIT binary patch delta 46 zcmcb@x`cIt0;9@AMR_3M7|qx;ajr6B+{A ptBrowser) and (Application <> nil) then begin // This is the fix for the issue #139 @@ -712,6 +716,7 @@ begin {$ENDIF} end; {$ENDIF} + {$ENDIF} TempApp := TCustomCefApp.Create(self); Result := (ExecuteProcess(TempApp) < 0) and InitializeLibrary(TempApp);