Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   TWebBrowser, EdgeIfAvailable (https://www.delphipraxis.net/214653-twebbrowser-edgeifavailable.html)

looseleaf 15. Feb 2024 11:51

TWebBrowser, EdgeIfAvailable
 
Liebe Gemeinde,

aus Kompaibilitäsgründen würden wir in Delphi 12 gern TWebBrowser weiterverwenden mi EdgeIfAvailable.
Da gibt es ja lt. [1] das Problem, dass OnNavigateError nicht mehr aufgerufen wird, wenn Edge verwendet wird.
Wie schaffe ich es, dass ich nach einem Navigate(URL) darauf reagiere, ob hier ein 404 oder sonst ein anderer Fehler passiert ist?

Mein etwas kruder Ansatz ist jetzt der:
Code:
type TMyEdge=class(TWebBrowser)
     private
       function MyGetEdge: TEdgeBrowser;
     public
       property GetEdge: TEdgeBrowser read MyGetEdge;
     end;

function TMyEdge.MyGetEdge: TEdgeBrowser;
begin
  Result := inherited GetEdgeInterface;
end;

function GetEdgeBrowser(W: TWebBrowser): TEdgeBrowser;
begin
  Result := nil;
  if W.ActiveEngine=Edge then Result := TMyEdge(W).GetEdge;
end;
und dann würde ich an geeigneter Stelle ein
Code:
GetEdgeBrowser(WebBrowser1).OnNavigationCompleted := EdgeBrowser1NavigationCompleted;
einfügen und dort in dem Handler IsSucess abfragen und reagieren.

Probleme: Leider ist z.B. im FormCreate die ActiveEngine noch nicht da, weil noch nichts vom Browser verwendet wurde. Setze ich den Handler in einem DocumenComplete und lade die falsche URL noch einmal neu, dann geht das.

Gibt es da einen einfacheren Weg? Oder schaffe ich es, die Engine zu starten, auh wenn noch kein Navigate() verwendet wird?

Danke
Stefan


[1] http://docwiki.embarcadero.com/RADSt...on_TWebBrowser

looseleaf 15. Feb 2024 12:29

AW: TWebBrowser, EdgeIfAvailable
 
Ich beantworte einen Teil selber: Ich hab im MyGetEdge die Abfrage auf ActiveEngine entfernt, ich dachte, das wäre nötig, um keinen Blödsinn zu liefern.
Aber die Frage, ob es einen besseren Weg gibt, vorhandene Events des TWebBrowser an EdgeBrowser zu übersetzen, bleibt.
So is immer im Code nachzuarbeiten, da es in der IDE kein ensprechendes Property gibt...


Also zusammengefasst:

Code:
type TWebBrowserHelper = class helper for TWebBrowser
  private
    function MyGetEdge: TEdgeBrowser;
  public
    property GetEdge: TEdgeBrowser read MyGetEdge;
end;

function GetEdgeBrowser(W: TWebBrowser): TEdgeBrowser;
begin
  Result := nil;
  if W.ActiveEngine=Edge then Result := W.GetEdge;
end;

procedure TForm1.FormShow(Sender: TObject);
var e: TEdgeBrowser;
begin
Memo1.Lines.Clear;
e := WebBrowser1.GetEdge;
if e<>nil then
  e.OnNavigationCompleted := EdgeBrowser1NavigationCompleted;
end;

gubbe 15. Feb 2024 16:45

AW: TWebBrowser, EdgeIfAvailable
 
Ich wäre mir nicht sicher, ob das funktioniert.

Die Eigenschaft ActiveEngine kann auch den Wert "NoneYet" haben, wenn der Edge-Browser noch geladen wird. Wenn das schief geht, wird der IE geladen.
Wenn der Browser länger braucht zum Laden, ist vielleicht "OnShow" noch zu früh zum Setzen des Event-Handlers.

Eine Lösung könnte sein, den Event-Handler erst in OnBeforeNavigate2 zu setzen. Wenn geladen wird, ist der Browser auf jeden Fall da.

Code:
  if not (FBrowserInitialized) then
  begin
    e := WebBrowser1.GetEdge;
    if e<>nil then
      e.OnNavigationCompleted := EdgeBrowser1NavigationCompleted;  
    FBrowserInitialized := true;
  end;

looseleaf 16. Feb 2024 08:47

AW: TWebBrowser, EdgeIfAvailable
 
Zitat:

Zitat von gubbe (Beitrag 1533535)
Ich wäre mir nicht sicher, ob das funktioniert.

Ich denke schon, denn das Abrufen von GetEdge erstellt die Instanz, wenn sie noch nicht existiert, wenn ich den Code richtig interpretiere.
[...]
Du hast zwar recht, dass das Control noch nicht fertig sein könnte, allerdings ist FEdge zu dem Zeitpunkt schon gesetzt. Aber auf der sicheren Seite bin ich wirklich mit dem OnBeforeNavigate...
Danke für den Hinweis.

gubbe 16. Feb 2024 12:16

AW: TWebBrowser, EdgeIfAvailable
 
Zitat:

Zitat von looseleaf (Beitrag 1533554)

Ich denke schon, denn das Abrufen von GetEdge erstellt die Instanz, wenn sie noch nicht existiert, wenn ich den Code richtig interpretiere.
[...]
Du hast zwar recht, dass das Control noch nicht fertig sein könnte, allerdings ist FEdge zu dem Zeitpunkt schon gesetzt. Aber auf der sicheren Seite bin ich wirklich mit dem OnBeforeNavigate...
Danke für den Hinweis.

Ja, stimmt, GetEdge richtet bereits das Delphi-Control ein. Nur Deine Funktion "GetEdgeBrowser" würde nicht funktionieren, da ActiveEngine zunächst mit "NoneYet" initialisiert wird. Aber da Du die anscheinend gar nicht mehr verwendest und direkt GetEdge aufrufst, sollte alles schon in OnShow klappen.

Nur auf die Webview-Interfaces wie ICoreWebView2 kann man erst später zugreifen, wenn das Webview tatsächlich geladen wurde. Und es besteht noch die Gefahr, dass das Laden schiefgeht und als Fallback der IE geladen wird. Also sollte man den Rückgabewert von GetEdge nicht speichern.
Ist aber beides bei Deinem Code kein Problem.

looseleaf 19. Feb 2024 08:42

AW: TWebBrowser, EdgeIfAvailable
 
Zitat:

Zitat von looseleaf (Beitrag 1533554)
Zitat:

Zitat von gubbe (Beitrag 1533535)
Ich wäre mir nicht sicher, ob das funktioniert.

Ich denke schon, denn das Abrufen von GetEdge erstellt die Instanz, wenn sie noch nicht existiert, wenn ich den Code richtig interpretiere.
[...]
Du hast zwar recht, dass das Control noch nicht fertig sein könnte, allerdings ist FEdge zu dem Zeitpunkt schon gesetzt. Aber auf der sicheren Seite bin ich wirklich mit dem OnBeforeNavigate...
Danke für den Hinweis.

Ah, hast Recht. Ich habe in meinem Code die Abfrage auf ActiveEngine schon rausgenommen, als immer gesetzt, egal, welche Endinge aktiv ist. Sofern die Instanz nicht nil ist.
Aber wir haben uns entschieden, langsam alle TWebBrowser-Instanzen gegen TEdgeBrowser zu tauschen. Die IE-Engine zeigt ohenhin beinahe nirgens mehr die korrekten Inhalte an.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz