Obtenir l'URL d'un lien hypertexte lorsque la souris se déplace sur un document TWebBrowser





LaTWebBrowserLe composant Delphi permet d'accéder aux fonctionnalités du navigateur Web à partir de vos applications Delphi.

Dans la plupart des situations, vous utilisez le TWebBrowser pour afficher des documents HTML à l'utilisateur - créant ainsi votre propre version du navigateur Web (Internet Explorer). Notez que le TWebBrowser peut également afficher des documents Word, par exemple.



Une fonctionnalité très intéressante d'un navigateur est d'afficher des informations sur les liens, par exemple, dans la barre d'état, lorsque la souris survole un lien dans un document.

Le TWebBrowser n'expose pas un événement comme 'OnMouseMove'. Même si un tel événement existait, il serait déclenché pour le composant TWebBrowser - PAS pour le document affiché à l'intérieur du TWebBrowser.



Afin de fournir de telles informations (et bien plus encore, comme vous le verrez dans un instant) dans votre application Delphi à l'aide du composant TWebBrowser, une technique appelée ' événements naufrage ' doit être mis en œuvre.

Récepteur d'événements WebBrowser

Pour naviguer vers une page Web à l'aide du composant TWebBrowser, vous appelez le Naviguer méthode. La Document propriété du TWebBrowser renvoie une Document HTML2 valeur (pour les documents Web). Cette interface est utilisée pour récupérer des informations sur un document, pour examiner et modifier les éléments HTML et le texte dans le document, et pour traiter les événements associés.

Pour obtenir l'attribut 'href' (lien) d'une balise 'a' à l'intérieur d'un document, alors que la souris survole un document, vous devez réagir à l'événement 'onmousemove' du IHTMLDocument2.

Voici les étapes pour recevoir des événements pour le document actuellement chargé :



  1. Récupérer les événements du contrôle WebBrowser dans le DocumentTerminé événement déclenché par le TWebBrowser. Cet événement est déclenché lorsque le document est entièrement chargé dans le navigateur Web.
  2. Dans DocumentComplete, récupérez l'objet document du WebBrowser et récupérez l'interface HtmlDocumentEvents.
  3. Gérez l'événement qui vous intéresse.
  4. Dégagez l'évier dans le AvantNaviguer2 - c'est-à-dire lorsque le nouveau document est chargé dans le navigateur Web.

Document HTML OnMouseMove

Puisque nous nous intéressons à l'attribut HREF d'un élément A - afin d'afficher l'URL d'un lien sur lequel se trouve la souris, nous allons couler l'événement 'onmousemove'.

La procédure pour obtenir la balise (et ses attributs) 'sous' la souris peut être définie comme suit :



|__+_|

Comme expliqué ci-dessus, nous attachons à l'événement onmousemove d'un document dans l'événement OnDocumentComplete d'un TWebBrowser :

|__+_|

Et c'est là que les problèmes surgissent ! Comme vous pouvez le deviner, l'événement 'onmousemove' n'est *pas* un événement habituel - comme le sont ceux avec lesquels nous avons l'habitude de travailler dans Delphi.



Le 'onmousemove' attend un pointeur vers une variable de type VARIANT de type VT_DISPATCH qui reçoit l'interface IDispatch d'un objet avec une méthode par défaut qui est invoquée lorsque l'événement se produit.

Pour attacher une procédure Delphi à 'onmousemove', vous devez créer un wrapper qui implémente IDispatch et déclenche votre événement dans sa méthode Invoke.



Voici l'interface TEventObject :

|__+_|

Voici comment implémenter le naufrage d'événements pour un document affiché par le composant TWebBrowser - et obtenir les informations d'un élément HTML sous la souris.

Exemple de naufrage d'événement de document TWebBrowser

Télécharger

Déposez un TWebBrowser ('WebBrowser1') sur un formulaire ('Form1'). Ajouter un TMemo ('elementInfo')...

unité Unité 1;

interface

les usages
Windows, Messages, SysUtils, Variantes, Classes, Graphiques, Contrôles, Formulaires,
Boîtes de dialogue, OleCtrls, SHDocVw, MSHTML, ActiveX, StdCtrls ;

taper
TObjectProcedure = procédure de objet ;

TEventObject = classer (TInterfacedObject, IDispatch)
privé
FOnEvent : TObjectProcedure ;
protégé
fonction GetTypeInfoCount(out Count : Integer): HResult ; appel standard ;
fonction GetTypeInfo(Index, LocaleID : Integer ; out TypeInfo): HResult ; appel standard ;
fonction GetIDsOfNames( constante IID : TGUID ; Noms : pointeur ; NameCount, LocaleID : nombre entier ; DispIDs : pointeur) : HResult ; appel standard ;
fonction Invoke(DispID : Entier ; constante IID : TGUID ; LocaleID : nombre entier ; Drapeaux : mot ; a été Paramètres ; VarResult, ExcepInfo, ArgErr : Pointeur) : HResult ; appel standard ;
Publique
constructeur Créer( constante OnEvent : TObjectProcedure) ;
propriété OnEvent : TObjectProcedure lire FOnEvent écrire FOnEvent ;
fin ;

TForm1 = classer (TForm)
WebBrowser1 : TWebBrowser ;
elementInfo : TMemo ;
procédure WebBrowser1BeforeNavigate2(ASender : TObject ; constante pDisp : IDispatch ; a été URL, drapeaux, TargetFrameName, PostData, en-têtes : OleVariant ; a été Annuler : WordBool) ;
procédure WebBrowser1DocumentComplete(ASender : TObject ; constante pDisp : IDispatch ; a été URL : OleVariant) ;
procédure FormCreate(Sender: TObject) ;
privé
procédure Document_OnMouseOver ;
Publique
{ Public déclarations }
fin ;

a été
Form1 : TForm1 ;

htmlDoc : IHTMLDocument2 ;

la mise en oeuvre

{$R *.dfm}

procédure TForm1.Document_OnMouseOver ;
a été
élément : IHTMLElement;
commencer
si htmlDoc = néant alors Sortir;

element := htmlDoc.parentWindow.event.srcElement;

elementInfo.Clear ;

si Minuscule(element.tagName) = 'a' alors
commencer
elementInfo.Lines.Add('Informations sur le lien...') ;
elementInfo.Lines.Add(Format('HREF : %s',[element.getAttribute('href',0)])) ;
fin
autre si Minuscule(element.tagName) = 'img' alors
commencer
elementInfo.Lines.Add('IMAGE infos...') ;
elementInfo.Lines.Add(Format('SRC : %s',[element.getAttribute('src',0)])) ;
fin
autre
commencer
elementInfo.Lines.Add(Format('TAG : %s',[element.tagName])) ;
fin ;
fin ; (*Document_OnMouseOver*)


procédure TForm1.FormCreate(Expéditeur : TObject) ;
commencer
WebBrowser1.Navigate('http://delphi.about.com') ;

elementInfo.Clear ;
elementInfo.Lines.Add('Déplacez votre souris sur le document...') ;
fin ; (*FormCréer*)

procédure TForm1.WebBrowser1BeforeNavigate2(ASender : TObject ; constante pDisp : IDispatch ; a été URL, drapeaux, TargetFrameName, PostData, en-têtes : OleVariant ; a été Annuler : WordBool) ;
commencer
htmlDoc := néant ;
fin ; (*WebBrowser1BeforeNavigate2*)

procédure TForm1.WebBrowser1DocumentComplete(ASender : TObject ; constante pDisp : IDispatch ; a été URL : OleVariant) ;
commencer
si Attribué(WebBrowser1.Document) alors
commencer
htmlDoc := WebBrowser1.Document comme HTMLDocument2 ;

htmlDoc.onmouseover := (TEventObject.Create(Document_OnMouseOver) comme IDispatch) ;
fin ;
fin ; (*WebBrowser1DocumentComplet*)


{ TEventObject }

constructeur TEventObject.Create( constante OnEvent : TObjectProcedure) ;
commencer
hérité Créer;
FOnEvent := OnEvent;
fin ;

fonction TEventObject.GetIDsOfNames( constante IID : TGUID ; Noms : pointeur ; NameCount, LocaleID : nombre entier ; DispIDs : pointeur) : HResult ;
commencer
Resultat := E_NOTIMPL;
fin ;

fonction TEventObject.GetTypeInfo(Index, LocaleID : Integer; out TypeInfo): HResult;
commencer
Resultat := E_NOTIMPL;
fin ;

fonction TEventObject.GetTypeInfoCount(out Count: Integer): HResult;
commencer
Resultat := E_NOTIMPL;
fin ;

fonction TEventObject.Invoke(DispID : Entier ; constante IID : TGUID ; LocaleID : nombre entier ; Drapeaux : mot ; a été Paramètres ; VarResult, ExcepInfo, ArgErr : Pointeur) : HResult ;
commencer
si (DispID = DISPID_VALUE) alors
commencer
si Attribué(FOnEvent) alors FOnEvent ;
Resultat := S_OK;
fin
autre Resultat := E_NOTIMPL;
fin ;

fin .