AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi CEF4Delphi - Richtige Initialisierung in bestehendes Projekt
Thema durchsuchen
Ansicht
Themen-Optionen

CEF4Delphi - Richtige Initialisierung in bestehendes Projekt

Ein Thema von Minz3 · begonnen am 13. Nov 2019 · letzter Beitrag vom 9. Mär 2024
Antwort Antwort
Benutzerbild von Minz3
Minz3

Registriert seit: 18. Jul 2019
Ort: Thüringen
48 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

CEF4Delphi - Richtige Initialisierung in bestehendes Projekt

  Alt 13. Nov 2019, 09:01
Delphi-Version: 10.1 Berlin
Huhu Leute,

ich hab heute ein kniffliges Thema. Das Problem beschäftigt mich jetzt schon ein paar Tage und ich habe schon diverse Foren abgeklappert, nun seid ihr meine "letzte Hoffnung". ^^
Zuvor hatte ich schon im CEF Forum geschrieben, den Beitrag könnt ihr hier finden.

Aber nochmal von vorne..
Ich versuche in unser ERP System eine PWA (Progressive Web App) einzubinden. Da TWebBrowser scheinbar nur den IE unterstützt, da es auf den "OS Browser" zurückgreift, musste ich nach einer Alternative suchen. Und da kommt Chromium ins Spiel.
Soweit so gut, ich habe die Packages runtergeladen, in Delphi eingebunden und die Demos compiliert. Das hat auch da wunderbar funktioniert. Blöd nur, dass es im richtigen Projekt nicht mehr so reibungslos läuft.

Das Projekt bildet sich aus der Main Application, einen APP-Server und eine beträchtlichen Anzahl von Modulen (.bpl Files). Eben so ein Modul habe ich dann auch erstellt und erstmal nackig eingebunden, hat funktioniert. Jetzt scheint die Kommunikation zwischen der Main Application und den .bpl Files nicht ganz so einfach zu sein. Die .dpr der Main App musste angepasst werden, um die CEF Komponenten zu initialisieren. Siehe hier:
Delphi-Quellcode:
program ERP;

uses
  Forms,
  Vcl.Themes,
  Vcl.Styles,
  (...)
  uCEFApplication;

{$R *.RES}

// CEF3 needs to set the LARGEADDRESSAWARE flag which allows 32-bit processes to use up to 3GB of RAM.
{$SetPEFlags $20}

begin
{$IFDEF DEBUG}
  ReportMemoryLeaksOnShutdown := True;
  GlobalCEFApp.SingleProcess := True;
{$ENDIF}
  //VirtualUI.StdDialogs := True;
  GlobalCEFApp := TCefApplication.Create;
  if GlobalCEFApp.StartMainProcess then
  begin
    Application.Initialize;
    Application.Title := 'ERP';
    //Application.MainFormOnTaskbar := True;
    Application.CreateForm(TERPModulesFrame, ERPModulesFrame);
    //Application.OnException := ERPModulesFrame.GlobalHandleExceptions;
    Application.Run;
  end;
  GlobalCEFApp.Free;
  GlobalCEFApp := nil;
end.
Auch hier erstmal alles gut, wenn CEF erfolgreich initialisiert wurde, startet die App. Und das tut sie auch. Allerdings wird in der PWA Form nicht erkannt, dass die Initialisierung erfolgt ist und der Timer bleibt hängen. Hier mal ein kurzer Auszug:
Delphi-Quellcode:
procedure TPWAModuleForm.FormShow(Sender: TObject);
begin
  // For simplicity, this demo blocks all popup windows and new tabs
  ChromiumWindow1.ChromiumBrowser.OnBeforePopup := Chromium_OnBeforePopup;

  Logging('Chromium_OnBeforePopup: Popups and new Tabs blocked', 'FormShow');

  // You *MUST* call CreateBrowser to create and initialize the browser.
  // This will trigger the AfterCreated event when the browser is fully
  // initialized and ready to receive commands.

  // GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser
  // If it's not initialized yet, we use a simple timer to create the browser later.
  if not(ChromiumWindow1.CreateBrowser) then
  begin
    Timer1.Enabled := True;

    Logging('Timer1 enabled | !ChromiumWindow1.CreateBrowser: Browser not created yet', 'FormShow');
  end;

end;
Delphi-Quellcode:
procedure TPWAModuleForm.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;

  Logging('Timer1 disabled', 'Timer1Timer');
  if not(ChromiumWindow1.CreateBrowser) and not(ChromiumWindow1.Initialized) then
  begin
    Timer1.Enabled := True;

    Logging('Chromium not initialized | Browser not created | Timer started', 'Timer1Timer');
  end;
end;
Das Log File sieht dann so aus:
Code:
[13.11.2019 08:19:39]
Procedure: WMMove
Message:  ChromiumWindow1.NotifyMoveOrResizeStarted
 
[13.11.2019 08:19:39]
Procedure: GetModuleDescription
Message:  succeeded
 
[13.11.2019 08:19:39]
Procedure: WMMove
Message:  ChromiumWindow1.NotifyMoveOrResizeStarted
 
[13.11.2019 08:19:39]
Procedure: WMMove
Message:  ChromiumWindow1.NotifyMoveOrResizeStarted
 
[13.11.2019 08:19:39]
Procedure: FormShow
Message:  Chromium_OnBeforePopup: Popups and new Tabs blocked
 
[13.11.2019 08:19:39]
Procedure: FormShow
Message:  Timer1 enabled | !ChromiumWindow1.CreateBrowser: Browser not created yet
 
[13.11.2019 08:19:39]
Procedure: FormCreate
Message:  Trigger: FCanClose False | FClosing False
 
[13.11.2019 08:19:40]
Procedure: Timer1Timer
Message:  Timer1 disabled
 
[13.11.2019 08:19:40]
Procedure: Timer1Timer
Message:  Chromium not initialized | Browser not created | Timer started
 
[13.11.2019 08:19:40]
Procedure: GoBtnClick
Message:  Succeeded! | New URL loaded
 
[13.11.2019 08:19:41]
Procedure: Timer1Timer
Message:  Timer1 disabled
 
[13.11.2019 08:19:41]
Procedure: Timer1Timer
Message:  Chromium not initialized | Browser not created | Timer started
 
[13.11.2019 08:19:42]
Procedure: Timer1Timer
Message:  Timer1 disabled
 
[13.11.2019 08:19:42]
Procedure: Timer1Timer
Message:  Chromium not initialized | Browser not created | Timer started
 
[13.11.2019 08:19:43]
Procedure: Timer1Timer
Message:  Timer1 disabled
 
[13.11.2019 08:19:43]
Procedure: Timer1Timer
Message:  Chromium not initialized | Browser not created | Timer started
 
[13.11.2019 08:19:44]
Procedure: FormCloseQuery
Message:  Visible False | FClosing True | ChromiumWindow1 closed
Also wie ihr sehen könnt, wird im Timer Event immer wieder geschaut, ob die Initialisierung erfolgt ist. Ich stelle mir die Frage, wie ich der .bpl klar machen kann, dass in der .dpr von der Main App die Initialisierung abgeschlossen ist?

Sorry für diese Wall of Text und ich danke euch für eventuelle Ratschläge.
Attention:
Brain.exe has stopped working. Reboot the system in 3... 2... 1... ... ... ... Attempt failed.

Geändert von Minz3 (13. Nov 2019 um 09:12 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: CEF4Delphi - Richtige Initialisierung in bestehendes Projekt

  Alt 13. Nov 2019, 09:28
Das TPWAModuleForm ist in der BPL?

Denkanstoß: Wie würdest du von deiner Main-EXE aus ein Modul benachrichtigen, wenn es in einer geladenen DLL oder gar in einer externen Anwendung liegen würde?
  Mit Zitat antworten Zitat
Benutzerbild von Minz3
Minz3

Registriert seit: 18. Jul 2019
Ort: Thüringen
48 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

AW: CEF4Delphi - Richtige Initialisierung in bestehendes Projekt

  Alt 13. Nov 2019, 09:39
Das TPWAModuleForm ist in der BPL?
Jup also es ist in seiner eigenen bpl, wo nur die MiPWAFrm.pas Datei drin ist.

Zitat:
Denkanstoß: Wie würdest du von deiner Main-EXE aus ein Modul benachrichtigen, wenn es in einer geladenen DLL oder gar in einer externen Anwendung liegen würde?
Da ich das noch nicht gemacht habe, kann ich nur schätzen. Ich vermute, dass sich das über die Projektoptionen einstellen ließe richtig?
Attention:
Brain.exe has stopped working. Reboot the system in 3... 2... 1... ... ... ... Attempt failed.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: CEF4Delphi - Richtige Initialisierung in bestehendes Projekt

  Alt 13. Nov 2019, 09:57
Ein bisschen Lesestoff (nein, ist nicht optional - bitte lesen):
https://www.delphipraxis.net/171762-...-packages.html

Du brauchst sozusagen sowas wie:

Delphi-Quellcode:
unit MiPWAFrm;

interface

procedure DingensKirchenIstFertigGeladen;

exports // gleiche Technik wie bei DLLs
  DingensKirchenIstFertigGeladen;

implementation

uses
  Dialogs;

procedure DingensKirchenIstFertigGeladen;
begin
  ShowMessage('Ich wurde von der Main-App aus gerufen und sage damit dem BPL-Package, dass in der Main-App jetzt alles fertig ist' + sLineBreak +
  'Ja, auch Übergabeparameter sind damit möglich!' + sLineBreak +
  'Und ja, das ist nur ganz beispielhafter Beispielcode, den du noch sinnvoll für deine Anwendung abändern musst!');

  if Asssigned(MeineFormularVariable) then
    MeineFormularVariable.DingensKirchenIstGeladen := True;
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von Minz3
Minz3

Registriert seit: 18. Jul 2019
Ort: Thüringen
48 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: CEF4Delphi - Richtige Initialisierung in bestehendes Projekt

  Alt 13. Nov 2019, 10:04
Ok danke dir ich werde mir das anschauen und versuchen, es so gut es geht umzusetzen.
Attention:
Brain.exe has stopped working. Reboot the system in 3... 2... 1... ... ... ... Attempt failed.
  Mit Zitat antworten Zitat
Omi

Registriert seit: 21. Jan 2004
13 Beiträge
 
#6

AW: CEF4Delphi - Richtige Initialisierung in bestehendes Projekt

  Alt 9. Mär 2024, 16:19
Hallo,

ich habe genau das gleiche Problem.

Wie hast Du es damals gelöst?

Gruß
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: CEF4Delphi - Richtige Initialisierung in bestehendes Projekt

  Alt 9. Mär 2024, 16:41
In 2024 nimmt man lieber gleich TEdgeBrowser und "überspringt" CEF4Delphi.
Spart einen mittlerweile fast 1/2 GB an sonst nötigen Bereistellungen im eigenen Programm einfach
Einfach den Browser nehmen, der bei 99,9% schon eh als integrierbares Control installiert ist.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz