AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TWebBrowser, EdgeIfAvailable

Ein Thema von looseleaf · begonnen am 15. Feb 2024 · letzter Beitrag vom 19. Feb 2024
Antwort Antwort
looseleaf

Registriert seit: 25. Mai 2011
69 Beiträge
 
#1

TWebBrowser, EdgeIfAvailable

  Alt 15. Feb 2024, 12:51
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
  Mit Zitat antworten Zitat
looseleaf

Registriert seit: 25. Mai 2011
69 Beiträge
 
#2

AW: TWebBrowser, EdgeIfAvailable

  Alt 15. Feb 2024, 13:29
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;
  Mit Zitat antworten Zitat
Benutzerbild von gubbe
gubbe

Registriert seit: 8. Okt 2005
Ort: Schleswig-Holstein
126 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: TWebBrowser, EdgeIfAvailable

  Alt 15. Feb 2024, 17:45
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;
  Mit Zitat antworten Zitat
looseleaf

Registriert seit: 25. Mai 2011
69 Beiträge
 
#4

AW: TWebBrowser, EdgeIfAvailable

  Alt 16. Feb 2024, 09:47
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.
  Mit Zitat antworten Zitat
Benutzerbild von gubbe
gubbe

Registriert seit: 8. Okt 2005
Ort: Schleswig-Holstein
126 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: TWebBrowser, EdgeIfAvailable

  Alt 16. Feb 2024, 13:16

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.
  Mit Zitat antworten Zitat
looseleaf

Registriert seit: 25. Mai 2011
69 Beiträge
 
#6

AW: TWebBrowser, EdgeIfAvailable

  Alt 19. Feb 2024, 09:42
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.
  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 06:12 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