Rufen Sie die URL eines Hyperlinks ab, wenn sich die Maus über ein TWebBrowser-Dokument bewegt

Die TWebBrowser-Delphi-Komponente bietet Zugriff auf die Webbrowser-Funktionalität aus Ihren Delphi-Anwendungen.

In den meisten Situationen verwenden Sie den TWebBrowser, um dem Benutzer HTML-Dokumente anzuzeigen. Auf diese Weise erstellen Sie eine eigene Version des Webbrowsers (Internet Explorer). Beachten Sie, dass der TWebBrowser beispielsweise auch Word-Dokumente anzeigen kann.

Eine sehr schöne Funktion eines Browsers ist die Anzeige von Linkinformationen, z. B. in der Statusleiste, wenn Sie mit der Maus über einen Link in einem Dokument fahren.

Der TWebBrowser macht kein Ereignis wie "OnMouseMove" verfügbar. Selbst wenn ein solches Ereignis existieren würde, würde es für die TWebBrowser-Komponente ausgelöst - NICHT für das Dokument, das im TWebBrowser angezeigt wird.

Um solche Informationen (und vieles mehr, wie Sie gleich sehen werden) in Ihrer Delphi-Anwendung mithilfe der TWebBrowser-Komponente bereitzustellen, wird eine Technik namens "Ereignisse sinken"muss implementiert werden.

WebBrowser Event Sink

Um mit der TWebBrowser-Komponente zu einer Webseite zu navigieren, rufen Sie die Navigieren Methode. Das Dokumentieren Eigenschaft des TWebBrowser gibt ein zurück IHTMLDocument2 value (für Webdokumente). Diese Schnittstelle wird verwendet, um Informationen zu einem Dokument abzurufen, die HTML-Elemente und den Text im Dokument zu untersuchen und zu ändern und um verwandte Ereignisse zu verarbeiten.

Um das "href" -Attribut (Link) eines "a" -Tags in einem Dokument zu erhalten, müssen Sie auf das "onmousemove" -Ereignis des IHTMLDocument2 reagieren, während Sie mit der Maus über ein Dokument fahren.

Führen Sie die folgenden Schritte aus, um Ereignisse für das aktuell geladene Dokument zu speichern:

  1. Versenken Sie die Ereignisse des WebBrowser-Steuerelements in das DocumentComplete Ereignis, das vom TWebBrowser ausgelöst wird. Dieses Ereignis wird ausgelöst, wenn das Dokument vollständig in den Webbrowser geladen ist.
  2. Rufen Sie in DocumentComplete das Dokumentobjekt des Webbrowsers ab und binden Sie die HtmlDocumentEvents-Schnittstelle ein.
  3. Behandle die Veranstaltung, an der du interessiert bist.
  4. Räumen Sie die Spüle in der BeforeNavigate2 - In diesem Fall wird das neue Dokument in den Webbrowser geladen.

HTML-Dokument OnMouseMove

Da wir am HREF-Attribut eines A-Elements interessiert sind - um die URL eines Links anzuzeigen, über den sich die Maus befindet, wird das Ereignis "onmousemove" ausgelöst.

Die Prozedur zum Abrufen des Tags (und seiner Attribute) "unterhalb" der Maus kann wie folgt definiert werden:

 var   htmlDoc: IHTMLDocument2;… Verfahren TForm1.Document_OnMouseOver; var    Element: IHTMLElement; Start    wenn htmlDoc = Null dann Ausgang; element: = htmlDoc.parentWindow.event.srcElement; elementInfo.Clear;    wenn LowerCase (element.tagName) = 'a' dann    Start      ShowMessage ('Link, HREF:' + element.getAttribute ('href', 0)]);    Ende    sonst wenn LowerCase (element.tagName) = 'img' dann    Start      ShowMessage ('IMAGE, SRC:' + element.getAttribute ('src', 0)]);    Ende    sonst    Start      elementInfo.Lines.Add (Format ('TAG:% s', [element.tagName]));    Ende; Ende; (* Document_OnMouseOver *) 

Wie oben erläutert, hängen wir das Ereignis onmousemove eines Dokuments im Ereignis OnDocumentComplete eines TWebBrowsers an:

 Verfahren TForm1.WebBrowser1DocumentComplete (ASender: TObject; const pDisp: IDispatch; var URL: OleVariant); Start    wenn Zugewiesen (WebBrowser1.Document) dann    Start      htmlDoc: = WebBrowser1.Document wie IHTMLDocument2; htmlDoc.onmouseover: = (TEventObject.Create (Document_OnMouseOver) wie IDispatch);    Ende; Ende; (* WebBrowser1DocumentComplete *) 

Und hier entstehen die Probleme! Wie Sie vielleicht vermuten, ist das "onmousemove" -Ereignis * nicht * ein gewöhnliches Ereignis - genau wie die Ereignisse, mit denen wir in Delphi arbeiten.

"Onmousemove" erwartet einen Zeiger auf eine Variable vom Typ VARIANT vom Typ VT_DISPATCH, die die IDispatch-Schnittstelle eines Objekts mit einer Standardmethode empfängt, die beim Auftreten des Ereignisses aufgerufen wird.

Um eine Delphi-Prozedur an "onmousemove" anzuhängen, müssen Sie einen Wrapper erstellen, der IDispatch implementiert und Ihr Ereignis in seiner Invoke-Methode auslöst.

Hier ist die TEventObject-Oberfläche:

 TEventObject = Klasse(TInterfacedObject, IDispatch) Privat    FOnEvent: TObjectProcedure; geschützt    Funktion GetTypeInfoCount (aus Count: Integer): HResult; stdcall;    Funktion GetTypeInfo (Index, LocaleID: Integer; aus TypeInfo): HResult; stdcall;    Funktion GetIDsOfNames (const IID: TGUID; Namen: Zeiger; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;    Funktion Invoke (DispID: Integer; const IID: TGUID; LocaleID: Integer; Fahnen: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall; Öffentlichkeit    Konstrukteur Erstellen(const OnEvent: TObjectProcedure);    Eigentum OnEvent: TObjectProcedure lesen FOnEvent schreiben FOnEvent;    Ende; 

So implementieren Sie die Ereignissenkung für ein Dokument, das von der TWebBrowser-Komponente angezeigt wird, und rufen die Informationen eines HTML-Elements unter der Maus ab.

Beispiel für das Absinken von TWebBrowser-Dokumentenereignissen

Herunterladen

Löschen Sie ein TWebBrowser ("WebBrowser1") auf einem Formular ("Form1"). TMemo ("elementInfo") hinzufügen…

Einheit Einheit 1;
Schnittstelle
Verwendet
   Windows, Nachrichten, SysUtils, Varianten, Klassen, Grafiken, Steuerelemente, Formulare,
   Dialoge, OleCtrls, SHDocVw, MSHTML, ActiveX, StdCtrls;
Art
   TObjectProcedure = Verfahren von Objekt;
   TEventObject = Klasse(TInterfacedObject, IDispatch)
   Privat
     FOnEvent: TObjectProcedure;
   geschützt
     Funktion GetTypeInfoCount (out Count: Integer): HResult; stdcall;
     Funktion GetTypeInfo (Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
     Funktion GetIDsOfNames (const IID: TGUID; Namen: Zeiger; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
     Funktion Invoke (DispID: Integer; const IID: TGUID; LocaleID: Integer; Fahnen: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
   Öffentlichkeit
     Konstrukteur Erstellen(const OnEvent: TObjectProcedure);
     Eigentum OnEvent: TObjectProcedure read FOnEvent write FOnEvent;
   Ende;
   TForm1 = Klasse(TForm)
     WebBrowser1: TWebBrowser;
     elementInfo: TMemo;
     Verfahren WebBrowser1BeforeNavigate2 (ASender: TObject; const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, Header: OleVariant; var Abbrechen: WordBool);
     Verfahren WebBrowser1DocumentComplete (ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
     Verfahren FormCreate (Absender: TObject);
   Privat
     Verfahren Document_OnMouseOver;
   Öffentlichkeit
     Öffentlichkeit Erklärungen
   Ende;
var
   Form1: TForm1;
   htmlDoc: IHTMLDocument2;
Implementierung
$ R * .dfm
Verfahren TForm1.Document_OnMouseOver;
var
   Element: IHTMLElement;
Start
   wenn htmlDoc = Null dann Ausgang;
   element: = htmlDoc.parentWindow.event.srcElement;
   elementInfo.Clear;
   wenn LowerCase (element.tagName) = 'a' dann
   Start
     elementInfo.Lines.Add ('LINK info…');
     elementInfo.Lines.Add (Format ('HREF:% s', [element.getAttribute ('href', 0)]));
   Ende
   sonst wenn LowerCase (element.tagName) = 'img' dann
   Start
     elementInfo.Lines.Add ('IMAGE info…');
     elementInfo.Lines.Add (Format ('SRC:% s', [element.getAttribute ('src', 0)]));
   Ende
   sonst
   Start
     elementInfo.Lines.Add (Format ('TAG:% s', [element.tagName]));
   Ende;
Ende; (* Document_OnMouseOver *)
Verfahren TForm1.FormCreate (Absender: TObject);
Start
   WebBrowser1.Navigate ('http://delphi.about.com');
   elementInfo.Clear;
   elementInfo.Lines.Add ('Bewegen Sie die Maus über das Dokument ...');
Ende; (* FormCreate *)
Verfahren TForm1.WebBrowser1BeforeNavigate2 (ASender: TObject; const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, Header: OleVariant; var Abbrechen: WordBool);
Start
   htmlDoc: = Null;
Ende; (* WebBrowser1BeforeNavigate2 *)
Verfahren TForm1.WebBrowser1DocumentComplete (ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
Start
   wenn Zugewiesen (WebBrowser1.Document) dann
   Start
     htmlDoc: = WebBrowser1.Document wie IHTMLDocument2;
     htmlDoc.onmouseover: = (TEventObject.Create (Document_OnMouseOver) wie IDispatch);
   Ende;
Ende; (* WebBrowser1DocumentComplete *)
TEventObject
Konstrukteur TEventObject.Create (const OnEvent: TObjectProcedure);
Start
   vererbt Erstellen;
   FOnEvent: = OnEvent;
Ende;
Funktion TEventObject.GetIDsOfNames (const IID: TGUID; Namen: Zeiger; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult;
Start
   Ergebnis: = E_NOTIMPL;
Ende;
Funktion TEventObject.GetTypeInfo (Index, LocaleID: Integer; out TypeInfo): HResult;
Start
   Ergebnis: = E_NOTIMPL;
Ende;
Funktion TEventObject.GetTypeInfoCount (out Count: Integer): HResult;
Start
   Ergebnis: = E_NOTIMPL;
Ende;
Funktion TEventObject.Invoke (DispID: Integer; const IID: TGUID; LocaleID: Integer; Fahnen: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult;
Start
   wenn (DispID = DISPID_VALUE) dann
   Start
     wenn Zugewiesen (FOnEvent) dann FOnEvent;
     Ergebnis: = S_OK;
   Ende
   sonst Ergebnis: = E_NOTIMPL;
Ende;
Ende.