Pridobite URL hiperpovezave, ko se miška premakne čez dokument TWebBrowser





TheTWebBrowserKomponenta Delphi omogoča dostop do funkcionalnosti spletnega brskalnika iz vaših aplikacij Delphi.

V večini primerov uporabite TWebBrowser za prikaz dokumentov HTML uporabniku - tako ustvarite svojo različico spletnega brskalnika (Internet Explorer). Upoštevajte, da lahko TWebBrowser na primer prikaže tudi Wordove dokumente.



Zelo dobra lastnost brskalnika je prikaz informacij o povezavi, na primer v vrstici stanja, ko se z miško pomaknete nad povezavo v dokumentu.

TWebBrowser ne izpostavi dogodka, kot je 'OnMouseMove'. Tudi če bi tak dogodek obstajal, bi bil sprožen za komponento TWebBrowser - NE za dokument, ki je prikazan znotraj TWebBrowserja.



Za zagotovitev takšnih informacij (in še veliko več, kot boste videli čez trenutek) v vaši aplikaciji Delphi z uporabo komponente TWebBrowser je potrebna tehnika, imenovana ' dogajanje tone ' je treba izvajati.

Ponor dogodkov spletnega brskalnika

Za navigacijo do spletne strani s komponento TWebBrowser, ki jo pokličete Navigacija metoda. The Dokument lastnost brskalnika TWebBrowser vrne HTMLDokument2 vrednost (za spletne dokumente). Ta vmesnik se uporablja za pridobivanje informacij o dokumentu, za pregled in spreminjanje elementov HTML in besedila v dokumentu ter za obdelavo povezanih dogodkov.

Če želite dobiti atribut (povezavo) 'href' oznake 'a' znotraj dokumenta, medtem ko miška lebdi nad dokumentom, se morate odzvati na dogodek 'onmousemove' IHTMLDocument2.

Tukaj so koraki za potopitev dogodkov za trenutno naložen dokument:



  1. Potopite dogodke kontrolnika spletnega brskalnika v DocumentComplete dogodek, ki ga sproži TWebBrowser. Ta dogodek se sproži, ko je dokument v celoti naložen v spletni brskalnik.
  2. Znotraj DocumentComplete pridobite objekt dokumenta spletnega brskalnika in potopite vmesnik HtmlDocumentEvents.
  3. Uredite dogodek, ki vas zanima.
  4. Počistite umivalnik v notranjosti Pred Navigate2 - takrat se nov dokument naloži v spletni brskalnik.

Dokument HTML OnMouseMove

Ker nas zanima atribut HREF elementa A - da bi prikazali URL povezave, nad katero je miška, bomo potopili dogodek 'onmousemove'.

Postopek za pridobitev oznake (in njenih atributov) 'pod' miško je mogoče definirati kot:



|_+_|

Kot je razloženo zgoraj, priložimo dogodku onmousemove dokumenta v dogodku OnDocumentComplete brskalnika TWebBrowser:

|_+_|

In tu nastanejo težave! Kot morda ugibate, dogodek 'onmousemove' *ni* običajen dogodek - kot so tisti, s katerimi smo vajeni delati v Delphiju.



'onmousemove' pričakuje kazalec na spremenljivko tipa VARIANT tipa VT_DISPATCH, ki prejme vmesnik IDispatch objekta s privzeto metodo, ki se prikliče, ko pride do dogodka.

Če želite pripeti proceduro Delphi na 'onmousemove', morate ustvariti ovoj, ki implementira IDispatch in dvigne vaš dogodek v njegovi metodi Invoke.



Tukaj je vmesnik TEventObject:

|_+_|

Tukaj je opisano, kako implementirati potapljanje dogodkov za dokument, ki ga prikaže komponenta TWebBrowser – in pridobiti informacije o elementu HTML pod miško.

Primer potopitve dogodka dokumenta TWebBrowser

Prenesi

Spustite TWebBrowser ('WebBrowser1') na obrazec ('Form1'). Dodajte TMemo ('elementInfo') ...

enota enota1;

vmesnik

uporablja
Windows, sporočila, SysUtils, različice, razredi, grafika, kontrolniki, obrazci,
Pogovorna okna, OleCtrl, SHDocVw, MSHTML, ActiveX, StdCtrl;

vrsta
TObjectProcedure = postopek od predmet ;

TEventObject = razred (TInterfacedObject, IDispatch)
zasebno
FOnEvent: TObjectProcedure;
zaščiten
funkcijo GetTypeInfoCount(out Count: Integer): HResult; stdcall;
funkcijo GetTypeInfo(Indeks, LocaleID: Integer; out TypeInfo): HResult; stdcall;
funkcijo GetIDsOfNames( konst IID: TGUID; Imena: Kazalec; NameCount, LocaleID: Integer; DispID-ji: Kazalec): HResult; stdcall;
funkcijo Invoke(DispID: Integer; konst IID: TGUID; LocaleID: Celo število; Zastavice: Beseda; je bil Params; VarResult, ExcepInfo, ArgErr: Kazalec): HResult; stdcall;
javnosti
konstruktor Ustvari ( konst OnEvent: TObjectProcedure);
premoženje OnEvent: TObjectProcedure branje FOnEvent pisanje FOnEvent;
konec ;

TForm1 = razred (TForm)
Spletni Brskalnik1: TWebBrowser;
elementInfo: TMemo;
postopek WebBrowser1BeforeNavigate2(ASender: TObject; konst pDisp: IDispatch; je bil URL, zastavice, TargetFrameName, PostData, Headers: OleVariant; je bil Prekliči: WordBool);
postopek WebBrowser1DocumentComplete(ASender: TObject; konst pDisp: IDispatch; je bil URL: OleVariant);
postopek FormCreate(Pošiljatelj: TObject) ;
zasebno
postopek Document_OnMouseOver;
javnosti
{ Javno izjave }
konec ;

je bil
Obrazec1: TForm1;

htmlDoc : IHTMLDocument2;

izvajanje

{$R *.dfm}

postopek TForm1.Document_OnMouseOver;
je bil
element : IHTMLElement;
začeti
če htmlDoc = nič potem Izhod;

element := htmlDoc.parentWindow.event.srcElement;

elementInfo.Clear;

če LowerCase(element.tagName) = 'a' potem
začeti
elementInfo.Lines.Add('Informacije o POVEZAVI...') ;
elementInfo.Lines.Add(Format('HREF : %s',[element.getAttribute('href',0)])) ;
konec
drugače če LowerCase(element.tagName) = 'img' potem
začeti
elementInfo.Lines.Add('Informacije o SLIKAH...') ;
elementInfo.Lines.Add(Format('SRC : %s',[element.getAttribute('src',0)])) ;
konec
drugače
začeti
elementInfo.Lines.Add(Format('TAG : %s',[element.tagName])) ;
konec ;
konec ; (*Document_OnMouseOver*)


postopek TForm1.FormCreate(Pošiljatelj: TObject) ;
začeti
WebBrowser1.Navigate('http://delphi.about.com') ;

elementInfo.Clear;
elementInfo.Lines.Add('Premaknite miško nad dokument...') ;
konec ; (*FormCreate*)

postopek TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; konst pDisp: IDispatch; je bil URL, zastavice, TargetFrameName, PostData, Headers: OleVariant; je bil Prekliči: WordBool);
začeti
htmlDoc := nič ;
konec ; (*WebBrowser1BeforeNavigate2*)

postopek TForm1.WebBrowser1DocumentComplete(ASender: TObject; konst pDisp: IDispatch; je bil URL: OleVariant);
začeti
če Dodeljeno (WebBrowser1.Document) potem
začeti
htmlDoc := WebBrowser1.Document kot HTMLDocument2;

htmlDoc.onmouseover := (TEventObject.Create(Document_OnMouseOver) kot IDispatch);
konec ;
konec ; (*WebBrowser1DocumentComplete*)


{TEventObject}

konstruktor TEventObject.Create( konst OnEvent: TObjectProcedure);
začeti
podedovana Ustvari;
FOnEvent := OnEvent;
konec ;

funkcijo TEventObject.GetIDsOfNames( konst IID: TGUID; Imena: Kazalec; NameCount, LocaleID: Integer; DispID-ji: Kazalec): HResult;
začeti
Rezultat := E_NOTIMPL;
konec ;

funkcijo TEventObject.GetTypeInfo(Indeks, LocaleID: Integer; out TypeInfo): HResult;
začeti
Rezultat := E_NOTIMPL;
konec ;

funkcijo TEventObject.GetTypeInfoCount(out Count: Integer): HResult;
začeti
Rezultat := E_NOTIMPL;
konec ;

funkcijo TEventObject.Invoke(DispID: Celo število; konst IID: TGUID; LocaleID: Celo število; Zastavice: Beseda; je bil Params; VarResult, ExcepInfo, ArgErr: Kazalec): HResult;
začeti
če (DispID = DISPID_VALUE) potem
začeti
če Dodeljeno (FOnEvent) potem FOnEvent;
Rezultat := S_OK;
konec
drugače Rezultat := E_NOTIMPL;
konec ;

konec .