De URL van een hyperlink ophalen wanneer de muis over een TWebBrowser-document beweegt





DeTWebBrowserDelphi-component biedt toegang tot de webbrowserfunctionaliteit vanuit uw Delphi-toepassingen.

In de meeste situaties gebruikt u de TWebBrowser om HTML-documenten weer te geven aan de gebruiker - en maakt u zo uw eigen versie van de (Internet Explorer) webbrowser. Merk op dat de TWebBrowser bijvoorbeeld ook Word-documenten kan weergeven.



Een erg leuke functie van een browser is om linkinformatie weer te geven, bijvoorbeeld in de statusbalk, wanneer de muis over een link in een document zweeft.

De TWebBrowser toont geen gebeurtenis zoals 'OnMouseMove'. Zelfs als een dergelijke gebeurtenis zou bestaan, zou deze worden geactiveerd voor de TWebBrowser-component - NIET voor het document dat wordt weergegeven in de TWebBrowser.



Om dergelijke informatie (en nog veel meer, zoals u zo zult zien) in uw Delphi-toepassing te verstrekken met behulp van de TWebBrowser-component, een techniek genaamd ' gebeurtenissen zinken ' moet worden uitgevoerd.

WebBrowser Event Sink

Om naar een webpagina te navigeren met behulp van de TWebBrowser-component roept u de Navigeren methode. De Document eigenschap van de TWebBrowser retourneert een HTMLDocument2 waarde (voor webdocumenten). Deze interface wordt gebruikt om informatie over een document op te halen, om de HTML-elementen en tekst in het document te onderzoeken en te wijzigen, en om gerelateerde gebeurtenissen te verwerken.

Om het 'href'-attribuut (link) van een 'a'-tag in een document te krijgen, terwijl de muis over een document zweeft, moet je reageren op de 'onmousemove'-gebeurtenis van het IHTMLDocument2.

Dit zijn de stappen om gebeurtenissen voor het momenteel geladen document te laten zinken:



  1. Zet de gebeurtenissen van het WebBrowser-besturingselement in de DocumentVoltooid evenement dat door de TWebBrowser is gegenereerd. Deze gebeurtenis wordt geactiveerd wanneer het document volledig in de webbrowser is geladen.
  2. Haal in DocumentComplete het documentobject van de WebBrowser op en laat de HtmlDocumentEvents-interface zinken.
  3. Behandel het evenement waarin u geïnteresseerd bent.
  4. Maak de gootsteen schoon in de in VoorNavigeren2 - dat is wanneer het nieuwe document in de webbrowser wordt geladen.

HTML-document OnMouseMove

Omdat we geïnteresseerd zijn in het HREF-attribuut van een A-element - om de URL van een link te tonen waar de muis zich bevindt, zullen we de gebeurtenis 'onmousemove' laten zinken.

De procedure om de tag (en zijn attributen) 'onder' de muis te krijgen, kan worden gedefinieerd als:



|__+_|

Zoals hierboven uitgelegd, hechten we aan de onmousemove-gebeurtenis van een document in de OnDocumentComplete-gebeurtenis van een TWebBrowser:

|__+_|

En hier ontstaan ​​de problemen! Zoals je zou kunnen raden, is de 'onmousemove'-gebeurtenis *niet* een gebruikelijke gebeurtenis - zoals we gewend zijn om mee te werken in Delphi.



De 'onmousemove' verwacht een pointer naar een variabele van het type VARIANT van het type VT_DISPATCH die de IDispatch-interface van een object ontvangt met een standaardmethode die wordt aangeroepen wanneer de gebeurtenis zich voordoet.

Om een ​​Delphi-procedure aan 'onmousemove' te koppelen, moet u een wrapper maken die IDispatch implementeert en uw gebeurtenis in zijn Invoke-methode verhoogt.



Hier is de TEventObject-interface:

|__+_|

Hier leest u hoe u event-sinking implementeert voor een document dat wordt weergegeven door de TWebBrowser-component - en de informatie van een HTML-element onder de muis krijgt.

TWebBrowser Document Event Sinking Voorbeeld

Downloaden

Zet een TWebBrowser ('WebBrowser1') op een formulier ('Form1'). Voeg een TMemo toe ('elementInfo')...

eenheid hoofdstuk 1;

koppel

toepassingen
Windows, Berichten, SysUtils, Varianten, Classes, Graphics, Controls, Forms,
Dialogen, OleCtrls, SHDocVw, MSHTML, ActiveX, StdCtrls;

type
TObjectProcedure = procedure van object ;

TEventObject = klas (TInterfacedObject, IDispatch)
privaat
FOnEvent: TObjectProcedure;
beschermd
functie GetTypeInfoCount(out Count: Integer): HResult; standaardoproep;
functie GetTypeInfo (Index, LocaleID: Integer; uit TypeInfo): HResult; standaardoproep;
functie GetIDsOfNames( const IID: TGUID; Namen: aanwijzer; NameCount, LocaleID: geheel getal; DispID's: aanwijzer): HResult; standaardoproep;
functie Aanroepen (DispID: geheel getal; const IID: TGUID; LocaleID: geheel getal; Vlaggen: Woord; was parameters; VarResult, ExcepInfo, ArgErr: Pointer): HResult; standaardoproep;
openbaar
constructeur Creëren( const OnEvent: TObjectProcedure) ;
eigendom OnEvent: TObjectProcedure lezen FOnEvent schrijven FOnEvent;
einde ;

TForm1 = klas (TForm)
WebBrowser1: TWebBrowser;
elementInfo: TMemo;
procedure WebBrowser1BeforeNavigate2(ASender: TObject; const pDisp: IDispatch; was URL, Vlaggen, TargetFrameName, PostData, Headers: OleVariant; was Annuleren: WordBool);
procedure WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; was URL: OleVariant) ;
procedure FormCreate(Afzender: TObject);
privaat
procedure Document_OnMouseOver;
openbaar
{ Openbaar verklaringen }
einde ;

was
Form1: TForm1;

htmlDoc: IHTMLDocument2;

implementatie

{$R *.dfm}

procedure TForm1.Document_OnMouseOver;
was
element: IHTMLlement;
beginnen
als htmlDoc = nul dan Uitgang;

element := htmlDoc.parentWindow.event.srcElement;

elementInfo.Wissen;

als LowerCase(element.tagName) = 'a' dan
beginnen
elementInfo.Lines.Add('LINK info...') ;
elementInfo.Lines.Add(Format('HREF : %s',[element.getAttribute('href',0)])) ;
einde
anders als LowerCase(element.tagName) = 'img' dan
beginnen
elementInfo.Lines.Add('IMAGE info...') ;
elementInfo.Lines.Add(Format('SRC : %s',[element.getAttribute('src',0)])) ;
einde
anders
beginnen
elementInfo.Lines.Add(Format('TAG: %s',[element.tagName])) ;
einde ;
einde ; (*Document_OnMouseOver*)


procedure TForm1.FormCreate(Afzender: TObject);
beginnen
WebBrowser1.Navigate('http://delphi.about.com');

elementInfo.Wissen;
elementInfo.Lines.Add('Beweeg uw muis over het document...') ;
einde ; (*Formulier maken*)

procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; const pDisp: IDispatch; was URL, Vlaggen, TargetFrameName, PostData, Headers: OleVariant; was Annuleren: WordBool);
beginnen
htmlDoc := nul ;
einde ; (*WebBrowser1BeforeNavigate2*)

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; was URL: OleVariant) ;
beginnen
als Toegewezen(WebBrowser1.Document) dan
beginnen
htmlDoc := WebBrowser1.Document net zo HTMLDocument2;

htmlDoc.onmouseover := (TEventObject.Create(Document_OnMouseOver) net zo IVerzending);
einde ;
einde ; (*WebBrowser1DocumentComplete*)


{ TEventObject }

constructeur TEventObject.Create( const OnEvent: TObjectProcedure) ;
beginnen
geërfd Creëren;
FOnEvent := OnEvent;
einde ;

functie TEventObject.GetIDsOfNames( const IID: TGUID; Namen: aanwijzer; NameCount, LocaleID: geheel getal; DispID's: aanwijzer): HResult;
beginnen
Resultaat := E_NOTIMPL;
einde ;

functie TEventObject.GetTypeInfo (Index, LocaleID: Integer; uit TypeInfo): HResult;
beginnen
Resultaat := E_NOTIMPL;
einde ;

functie TEventObject.GetTypeInfoCount(out Count: Integer): HResult;
beginnen
Resultaat := E_NOTIMPL;
einde ;

functie TEventObject.Invoke (DispID: geheel getal; const IID: TGUID; LocaleID: geheel getal; Vlaggen: Woord; was parameters; VarResult, ExcepInfo, ArgErr: Pointer): HResult;
beginnen
als (DispID = DISPID_VALUE) dan
beginnen
als Toegewezen (FOnEvent) dan FOnGebeurtenis;
Resultaat := S_OK;
einde
anders Resultaat := E_NOTIMPL;
einde ;

einde .