Získajte adresu URL hypertextového odkazu, keď sa myš pohybuje nad dokumentom TWebBrowser
TheTWebBrowserKomponent Delphi poskytuje prístup k funkciám webového prehliadača z vašich aplikácií Delphi.
Vo väčšine situácií používate TWebBrowser na zobrazenie HTML dokumentov používateľovi – a tak si vytvoríte vlastnú verziu webového prehliadača (Internet Explorer). Všimnite si, že TWebBrowser dokáže zobraziť napríklad aj dokumenty Word.
Veľmi príjemnou funkciou Prehliadača je zobrazenie informácií o odkaze napríklad v stavovom riadku, keď myšou prejdete na odkaz v dokumente.
TWebBrowser neodhaľuje udalosť ako 'OnMouseMove'. Aj keby takáto udalosť existovala, bola by spustená pre komponent TWebBrowser – NIE pre dokument zobrazený v TWebBrowser.
Aby ste mohli poskytnúť takéto informácie (a oveľa viac, ako o chvíľu uvidíte) vo vašej aplikácii Delphi pomocou komponentu TWebBrowser, technika nazývaná ' udalosti klesajú musí byť implementované.
Výlevka udalostí WebBrowser
Ak chcete prejsť na webovú stránku pomocou komponentu TWebBrowser, ktorý nazývate Navigovať metóda. The Dokument vlastnosť TWebBrowser vracia an HTMLDocument2 hodnotu (pre webové dokumenty). Toto rozhranie sa používa na získanie informácií o dokumente, na preskúmanie a úpravu prvkov HTML a textu v dokumente a na spracovanie súvisiacich udalostí.
Ak chcete získať atribút 'href' (odkaz) značky 'a' vo vnútri dokumentu, keď sa myš pohybuje nad dokumentom, musíte reagovať na udalosť 'onmousemove' v IHTMLDocument2.
Tu sú kroky na potopenie udalostí pre aktuálne načítaný dokument:
- Potopte udalosti ovládacieho prvku WebBrowser v Dokument je dokončený udalosť vyvolaná prehliadačom TWebBrowser. Táto udalosť sa spustí, keď sa dokument úplne načíta do webového prehliadača.
- Vo vnútri DocumentComplete získajte objekt dokumentu WebBrowser a potopte rozhranie HtmlDocumentEvents.
- Spracujte udalosť, o ktorú máte záujem.
- Vyčistite umývadlo v BeforeNavigate2 - vtedy sa nový dokument načíta do webového prehliadača.
HTML dokument OnMouseMove
Keďže nás zaujíma atribút HREF prvku A – aby sa zobrazila adresa URL odkazu, po prejdení myšou, potopíme udalosť 'onmousemove'.
Postup na získanie značky (a jej atribútov) „pod“ myšou možno definovať ako:
|_+_|
Ako je vysvetlené vyššie, k udalosti onmousemove dokumentu pripájame udalosť OnDocumentComplete prehliadača TWebBrowser:
|_+_|A tu vznikajú problémy! Ako by ste mohli uhádnuť, udalosť 'onmousemove' *nie je* bežnou udalosťou - rovnako ako tie, s ktorými sme zvyknutí pracovať v Delphi.
'onmousemove' očakáva ukazovateľ na premennú typu VARIANT typu VT_DISPATCH, ktorá prijíma rozhranie IDispatch objektu s predvolenou metódou, ktorá sa vyvolá pri výskyte udalosti.
Ak chcete pripojiť procedúru Delphi k 'onmousemove', musíte vytvoriť obal, ktorý implementuje IDispatch a vyvolá vašu udalosť vo svojej metóde Invoke.
Tu je rozhranie TEventObject:
|_+_|Tu je návod, ako implementovať potápanie udalostí pre dokument zobrazený komponentom TWebBrowser – a získať informácie o prvku HTML pod myšou.
Príklad potopenia udalosti dokumentu TWebBrowser
Stiahnuť ▼
Umiestnite TWebBrowser ('WebBrowser1') na formulár ('Form1'). Pridať TMemo ('elementInfo')...
jednotka lekcia 1;
rozhranie
používa
Windows, Správy, SysUtils, Varianty, Triedy, Grafika, Ovládacie prvky, Formuláre,
Dialógové okná, OleCtrls, SHDocVw, MSHTML, ActiveX, StdCtrls;
typu
TOObjectProcedure = postup z objekt ;
TEventObject = trieda (TInterfacedObject, IDispatch)
súkromné
FOnEvent: TObjectProcedure;
chránené
funkciu GetTypeInfoCount(out Count: Integer): HResult; stdcall;
funkciu GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
funkciu GetIDsOfNames( konšt IID: TGUID; Mená: Pointer; NameCount, LocaleID: Integer; DispIDs: Ukazovateľ): HResult; stdcall;
funkciu Invoke(DispID: Integer; konšt IID: TGUID; LocaleID: Integer; Príznaky: Slovo; bol Parametre; VarResult, ExcepInfo, ArgErr: Ukazovateľ): HResult; stdcall;
verejnosti
konštruktér Vytvoriť( konšt OnEvent: TObjectProcedure) ;
nehnuteľnosť OnEvent: TObjectProcedure čítať FOnEvent zápis FOnEvent;
koniec ;
TForm1 = trieda (TForma)
WebBrowser1: TWebBrowser;
elementInfo: TMemo;
postup WebBrowser1BeforeNavigate2(ASender: TObject; konšt pDisp: IDispatch; bol URL, Flags, TargetFrameName, PostData, Headers: OleVariant; bol Zrušiť: WordBool) ;
postup WebBrowser1DocumentComplete(ASender: TObject; konšt pDisp: IDispatch; bol URL: OleVariant) ;
postup FormCreate(Sender: TObject) ;
súkromné
postup Document_OnMouseOver;
verejnosti
{ Verejné deklarácie }
koniec ;
bol
Form1: TForm1;
htmlDoc : IHTMLDocument2;
implementáciu
{$R *.dfm}
postup TForm1.Document_OnMouseOver;
bol
prvok : IHTMLElement;
začať
ak htmlDoc = nula potom VÝCHOD;
element := htmlDoc.parentWindow.event.srcElement;
elementInfo.Clear;
ak Malé písmená(element.tagName) = 'a' potom
začať
elementInfo.Lines.Add('LINK info...') ;
elementInfo.Lines.Add(Format('HREF : %s',[element.getAttribute('href',0)])) ;
koniec
inak ak Malé písmená(element.tagName) = 'img' potom
začať
elementInfo.Lines.Add('Informácie o obrázku...') ;
elementInfo.Lines.Add(Format('SRC : %s',[element.getAttribute('src',0)])) ;
koniec
inak
začať
elementInfo.Lines.Add(Format('TAG : %s',[element.tagName])) ;
koniec ;
koniec ; (*Document_OnMouseOver*)
postup TForm1.FormCreate(Sender: TObject) ;
začať
WebBrowser1.Navigate('http://delphi.about.com') ;
elementInfo.Clear;
elementInfo.Lines.Add('Presuňte myš nad dokument...') ;
koniec ; (*FormCreate*)
postup TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; konšt pDisp: IDispatch; bol URL, Flags, TargetFrameName, PostData, Headers: OleVariant; bol Zrušiť: WordBool) ;
začať
htmlDoc := nula ;
koniec ; (*WebBrowser1BeforeNavigate2*)
postup TForm1.WebBrowser1DocumentComplete(ASender: TObject; konšt pDisp: IDispatch; bol URL: OleVariant) ;
začať
ak Priradené (WebBrowser1.Document) potom
začať
htmlDoc := WebBrowser1.Document ako HTMLDocument2;
htmlDoc.onmouseover := (TEventObject.Create(Document_OnMouseOver) ako IDodoslanie);
koniec ;
koniec ; (*WebBrowser1DocumentComplete*)
{ TEventObject }
konštruktér TEventObject.Create( konšt OnEvent: TObjectProcedure) ;
začať
zdedené Vytvorte;
FOnEvent := OnEvent;
koniec ;
funkciu TEventObject.GetIDsOfNames( konšt IID: TGUID; Mená: Pointer; NameCount, LocaleID: Integer; DispIDs: Ukazovateľ): HResult;
začať
Vysledok := E_NOTIMPL;
koniec ;
funkciu TEventObject.GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult;
začať
Vysledok := E_NOTIMPL;
koniec ;
funkciu TEventObject.GetTypeInfoCount(out Count: Integer): HResult;
začať
Vysledok := E_NOTIMPL;
koniec ;
funkciu TEventObject.Invoke(DispID: Integer; konšt IID: TGUID; LocaleID: Integer; Príznaky: Slovo; bol Parametre; VarResult, ExcepInfo, ArgErr: Ukazovateľ): HResult;
začať
ak (DispID = DISPID_VALUE) potom
začať
ak Priradené (FOnEvent) potom FOnEvent;
Vysledok := S_OK;
koniec
inak Vysledok := E_NOTIMPL;
koniec ;
koniec .