Ruft die URL eines Hyperlinks ab, wenn die Maus über ein TWebBrowser-Dokument bewegt wird
DasTWebBrowserDie Delphi-Komponente bietet Zugriff auf die Webbrowser-Funktionalität Ihrer Delphi-Anwendungen.
In den meisten Situationen verwenden Sie den TWebBrowser, um dem Benutzer HTML-Dokumente anzuzeigen - und erstellen so Ihre eigene Version des (Internet Explorer) Webbrowsers. Beachten Sie, dass der TWebBrowser beispielsweise auch Word-Dokumente anzeigen kann.
Ein sehr nettes Feature eines Browsers ist die Anzeige von Link-Informationen, beispielsweise in der Statusleiste, wenn die Maus über einen Link in einem Dokument fährt.
Der TWebBrowser zeigt kein Ereignis wie 'OnMouseMove' an. Selbst wenn ein solches Ereignis existieren würde, würde es für die TWebBrowser-Komponente ausgelöst werden – NICHT für das Dokument, das innerhalb des TWebBrowser angezeigt wird.
Um solche Informationen (und noch viel mehr, wie Sie gleich sehen werden) in Ihrer Delphi-Anwendung mit der TWebBrowser-Komponente bereitzustellen, ist eine Technik namens ' Veranstaltungen sinken “ müssen umgesetzt werden.
WebBrowser-Ereignissenke
Um mit der TWebBrowser-Komponente zu einer Webseite zu navigieren, rufen Sie die auf Navigieren Methode. Das Dokumentieren -Eigenschaft des TWebBrowser gibt an zurück HTMLDokument2 Wert (für Webdokumente). Diese Schnittstelle wird verwendet, um Informationen über ein Dokument abzurufen, die HTML-Elemente und den Text innerhalb des Dokuments zu untersuchen und zu ändern und zugehörige Ereignisse zu verarbeiten.
Um das 'href'-Attribut (Link) eines 'a'-Tags innerhalb eines Dokuments zu erhalten, während die Maus über einem Dokument schwebt, müssen Sie auf das 'onmousemove'-Ereignis des IHTMLDocument2 reagieren.
Hier sind die Schritte zum Senken von Ereignissen für das aktuell geladene Dokument:
- Versenken Sie die Ereignisse des WebBrowser-Steuerelements in der DokumentComplete Ereignis, das vom TWebBrowser ausgelöst wird. Dieses Ereignis wird ausgelöst, wenn das Dokument vollständig in den Webbrowser geladen wurde.
- Rufen Sie in DocumentComplete das Dokumentobjekt des WebBrowsers ab und versenken Sie die HtmlDocumentEvents-Schnittstelle.
- Bearbeiten Sie die Veranstaltung, an der Sie interessiert sind.
- Reinigen Sie das Waschbecken im Eingang VorNavigieren2 - dann wird das neue Dokument in den Webbrowser geladen.
HTML-Dokument OnMouseMove
Da wir an dem HREF-Attribut eines A-Elements interessiert sind, werden wir das 'onmousemove'-Ereignis versenken, um die URL eines Links anzuzeigen, über dem sich die Maus befindet.
Das Verfahren zum Abrufen des Tags (und seiner Attribute) „unter“ der Maus kann wie folgt definiert werden:
|_+_|
Wie oben erklärt, hängen wir an das onmousemove-Ereignis eines Dokuments im OnDocumentComplete-Ereignis eines TWebBrowsers an:
|_+_|Und genau hier tauchen die Probleme auf! Wie Sie vielleicht erraten haben, ist das 'onmousemove'-Ereignis *kein* gewöhnliches Ereignis - wie die, mit denen wir in Delphi arbeiten.
Das '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 aufgerufen wird, wenn das Ereignis eintritt.
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-Schnittstelle:
|_+_|So implementieren Sie Event-Sinking für ein Dokument, das von der TWebBrowser-Komponente angezeigt wird - und erhalten die Informationen eines HTML-Elements unter der Maus.
Beispiel für TWebBrowser Document Event Sinking
Download
Legen Sie einen TWebBrowser ('WebBrowser1') auf einem Formular ('Form1') ab. Fügen Sie ein TMemo hinzu ('elementInfo') ...
Einheit Einheit 1;
Schnittstelle
Verwendet
Windows, Nachrichten, SysUtils, Varianten, Klassen, Grafiken, Steuerelemente, Formulare,
Dialoge, OleCtrls, SHDocVw, MSHTML, ActiveX, StdCtrls;
Typ
TObjectProcedure = Verfahren von Objekt ;
TEventObject = Klasse (TInterfacedObject, IDispatch)
Privatgelände
FOnEvent: TObjectProcedure;
geschützt
Funktion GetTypeInfoCount(out Count: Integer): HResult; Standardruf;
Funktion GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; Standardruf;
Funktion GetIDsOfNames( konst IID: TGUID; Namen: Zeiger; NameCount, LocaleID: Ganzzahl; DispIDs: Pointer): HResult; Standardruf;
Funktion Invoke(DispID: Integer; konst IID: TGUID; LocaleID: Ganzzahl; Flaggen: Wort; war Parameter; VarResult, ExcepInfo, ArgErr: Pointer): HResult; Standardruf;
Öffentlichkeit
Konstrukteur Schaffen( konst OnEvent: TObjectProcedure) ;
Eigentum OnEvent: TObjectProcedure read FOnEvent write FOnEvent;
Ende ;
TForm1 = Klasse (TForm)
WebBrowser1: TWebBrowser;
elementInfo: TMemo;
Verfahren WebBrowser1BeforeNavigate2(ASender: TObject; konst pDisp: IDispatch; war URL, Flags, TargetFrameName, PostData, Header: OleVariant; war Abbrechen: WordBool) ;
Verfahren WebBrowser1DocumentComplete(ASender: TObject; konst pDisp: IDispatch; war URL: OleVariant) ;
Verfahren FormCreate(Sender: TObject) ;
Privatgelände
Verfahren Document_OnMouseOver;
Öffentlichkeit
{ Öffentlichkeit Deklarationen }
Ende ;
war
Formular1: TForm1;
htmlDoc : IHTMLDocument2;
Implementierung
{$R *.dfm}
Verfahren TForm1.Document_OnMouseOver;
war
element : IHTMLElement;
Start
wenn htmlDoc= Null dann Ausgang;
element := htmlDoc.parentWindow.event.srcElement;
elementInfo.Clear;
wenn Kleinbuchstaben (element.tagName) = 'a' dann
Start
elementInfo.Lines.Add('LINK info...') ;
elementInfo.Lines.Add(Format('HREF : %s',[element.getAttribute('href',0)])) ;
Ende
anders wenn Kleinbuchstaben (element.tagName) = 'img' dann
Start
elementInfo.Lines.Add('BILDinfo...') ;
elementInfo.Lines.Add(Format('SRC : %s',[element.getAttribute('src',0)])) ;
Ende
anders
Start
elementInfo.Lines.Add(Format('TAG : %s',[element.tagName])) ;
Ende ;
Ende ; (*Document_OnMouseOver*)
Verfahren TForm1.FormCreate(Sender: TObject) ;
Start
WebBrowser1.Navigate('http://delphi.about.com') ;
elementInfo.Clear;
elementInfo.Lines.Add('Bewege die Maus über das Dokument...') ;
Ende ; (*Formularerstellen*)
Verfahren TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; konst pDisp: IDispatch; war URL, Flags, TargetFrameName, PostData, Header: OleVariant; war Abbrechen: WordBool) ;
Start
htmlDoc := Null ;
Ende ; (*WebBrowser1BeforeNavigate2*)
Verfahren TForm1.WebBrowser1DocumentComplete(ASender: TObject; konst pDisp: IDispatch; war URL: OleVariant) ;
Start
wenn Zugewiesen (WebBrowser1.Dokument) dann
Start
htmlDoc := WebBrowser1.Dokument wie HTMLDokument2;
htmlDoc.onmouseover := (TEventObject.Create(Document_OnMouseOver) wie IDispatch) ;
Ende ;
Ende ; (*WebBrowser1DokumentComplete*)
{ TEventObject }
Konstrukteur TEventObject.Create( konst OnEvent: TObjectProcedure) ;
Start
vererbt Schaffen;
FOnEvent := OnEvent;
Ende ;
Funktion TEventObject.GetIDsOfNames( konst IID: TGUID; Namen: Zeiger; NameCount, LocaleID: Ganzzahl; 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: Ganzzahl; konst IID: TGUID; LocaleID: Ganzzahl; Flaggen: Wort; war Parameter; VarResult, ExcepInfo, ArgErr: Pointer): HResult;
Start
wenn (AnzeigeID = DISPID_VALUE) dann
Start
wenn Zugewiesen (FOnEvent) dann FOnEvent;
Ergebnis := S_OK;
Ende
anders Ergebnis := E_NOTIMPL;
Ende ;
Ende .