![]() |
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:
und dann würde ich an geeigneter Stelle ein
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;
Code:
einfügen und dort in dem Handler IsSucess abfragen und reagieren.
GetEdgeBrowser(WebBrowser1).OnNavigationCompleted := EdgeBrowser1NavigationCompleted;
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] ![]() |
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; |
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; |
AW: TWebBrowser, EdgeIfAvailable
Zitat:
[...] 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. |
AW: TWebBrowser, EdgeIfAvailable
Zitat:
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. |
AW: TWebBrowser, EdgeIfAvailable
Zitat:
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