Gaukite hipersaito URL, kai pelė juda per TWebBrowser dokumentą
TheTWebBrowserDelphi komponentas suteikia prieigą prie interneto naršyklės funkcijų iš jūsų Delphi programų.
Daugeliu atvejų HTML dokumentams rodyti vartotojui naudojate TWebBrowser – taip sukuriate savo (Internet Explorer) žiniatinklio naršyklės versiją. Atminkite, kad TWebBrowser taip pat gali rodyti, pavyzdžiui, Word dokumentus.
Labai graži naršyklės savybė yra nuorodos informacijos rodymas, pavyzdžiui, būsenos juostoje, kai pelė užvedama virš dokumento nuorodos.
TWebBrowser neatskleidžia tokio įvykio kaip „OnMouseMove“. Net jei toks įvykis būtų, jis būtų paleistas TWebBrowser komponentui – NE dokumentui, rodomam TWebBrowser viduje.
Norint pateikti tokią informaciją (ir daug daugiau, kaip netrukus pamatysite) savo Delphi programoje naudojant TWebBrowser komponentą, techniką, vadinamą ' įvykiai grimzta “ turi būti įgyvendintas.
„WebBrowser Event Sink“.
Norėdami pereiti į tinklalapį naudodami TWebBrowser komponentą, skambinate Rodyti kelią metodas. The dokumentas TWebBrowser nuosavybė grąžina an HTMLDocument2 vertė (žiniatinklio dokumentams). Ši sąsaja naudojama informacijai apie dokumentą gauti, dokumento HTML elementams ir tekstui ištirti ir modifikuoti bei susijusiems įvykiams apdoroti.
Norėdami dokumento viduje gauti žymos „a“ atributą „href“ (nuorodą), kai pelė užvedama virš dokumento, turite reaguoti į IHTMLDocument2 įvykį „onmousemove“.
Toliau pateikiami žingsniai, kaip sunaikinti šiuo metu įkelto dokumento įvykius:
- Panardinkite žiniatinklio naršyklės valdiklio įvykius į Dokumentas baigtas įvykis, kurį iškėlė TWebBrowser. Šis įvykis suaktyvinamas, kai dokumentas visiškai įkeliamas į žiniatinklio naršyklę.
- Programoje „DocumentComplete“ gaukite žiniatinklio naršyklės dokumento objektą ir įtraukite „HtmlDocumentEvents“ sąsają.
- Valdykite jus dominantį įvykį.
- Išvalykite kriauklę viduje Prieš naršymą2 - tai yra tada, kai naujas dokumentas įkeliamas į žiniatinklio naršyklę.
HTML dokumentas „OnMouseMove“.
Kadangi mus domina A elemento atributas HREF, norėdami parodyti nuorodos URL, kai pelė yra baigta, mes nuskandinsime įvykį „onmousemove“.
Procedūrą, skirtą žymai (ir jos atributams) gauti „po“ pele, galima apibrėžti taip:
|_+_|
Kaip paaiškinta aukščiau, mes pridedame prie dokumento įvykio onmousemove TWebBrowser įvykyje OnDocumentComplete:
|_+_|Ir čia iškyla problemos! Kaip galite spėti, „onmousemove“ įvykis *nėra* įprastas įvykis – kaip ir tie, su kuriais esame įpratę dirbti „Delphi“.
„onmousemove“ tikisi žymeklio į VT_DISPATCH tipo VARIANT tipo kintamąjį, kuris gauna objekto IDispatch sąsają numatytuoju metodu, kuris iškviečiamas įvykus įvykiui.
Norėdami pridėti „Delphi“ procedūrą prie „onmousemove“, turite sukurti paketą, kuris įdiegtų IDispatch ir pakeltų jūsų įvykį Invoke metodu.
Štai TEventObject sąsaja:
|_+_|Štai kaip įdiegti įvykių įtraukimą į dokumentą, rodomą TWebBrowser komponento, ir gauti informaciją apie HTML elementą po pele.
„TWebBrowser“ dokumento įvykio nugrimzdimo pavyzdys
parsisiųsti
Nuleiskite TWebBrowser („WebBrowser1“) ant formos („Form1“). Pridėti TMemo („elementInfo“)...
vienetas vienetas1;
sąsaja
naudoja
„Windows“, „Messages“, „SysUtils“, variantai, klasės, grafika, valdikliai, formos,
Dialogai, OleCtrls, SHDocVw, MSHTML, ActiveX, StdCtrls;
tipo
TObjectProcedure = procedūra apie objektas ;
TEventObject = klasė (TinterfacedObject, IDispatch)
privatus
FOnEvent: TObjectProcedure;
apsaugotas
funkcija GetTypeInfoCount(out Count: Integer): HResult; stdcall;
funkcija GetTypeInfo(Indeksas, LocaleID: Integer; out TypeInfo): HResult; stdcall;
funkcija GetIDsOfNames( konst IID: TGUID; Vardai: Rodyklė; NameCount, LocaleID: Integer; DispID: Rodyklė): HResult; stdcall;
funkcija Invoke(DispID: Sveikasis skaičius; konst IID: TGUID; Lokalės ID: sveikasis skaičius; Vėliavos: Word; buvo Paramos; VarResult, ExcepInfo, ArgErr: Rodyklė): HResult; stdcall;
viešas
konstruktorius Sukurti ( konst OnEvent: TObjectProcedure) ;
nuosavybė OnEvent: TObjectProcedure skaityti FOnEvent rašyti FOnEvent;
pabaiga ;
TForm1 = klasė (Tforma)
WebBrowser1: TWebBrowser;
elementInfo: TMemo;
procedūra WebBrowser1BeforeNavigate2(ASender: TObject; konst pDisp: IDispatch; buvo URL, Flags, TargetFrameName, PostData, Antraštės: OleVariant; buvo Atšaukti: WordBool) ;
procedūra WebBrowser1DocumentComplete(ASender: TObject; konst pDisp: IDispatch; buvo URL: OleVariant) ;
procedūra FormCreate(Siuntėjas: TObject) ;
privatus
procedūra Document_OnMouseOver;
viešas
{ Viešas deklaracijos }
pabaiga ;
buvo
Forma1: TForm1;
htmlDoc : IHTMLDocument2;
įgyvendinimas
{$R *.dfm}
procedūra TForm1.Document_OnMouseOver;
buvo
elementas : IHTMLElement;
pradėti
jeigu htmlDoc = nulis tada Išeiti;
elementas := htmlDoc.parentWindow.event.srcElement;
elementInfo.Clear;
jeigu Mažosios raidės(element.tagName) = 'a' tada
pradėti
elementInfo.Lines.Add('LINK info...') ;
elementInfo.Lines.Add(Format('HREF : %s',[element.getAttribute('href',0)])) ;
pabaiga
Kitas jeigu Mažosios raidės(element.tagName) = 'img' tada
pradėti
elementInfo.Lines.Add('VAIZDO informacija...') ;
elementInfo.Lines.Add(Format('SRC : %s',[element.getAttribute('src',0)])) ;
pabaiga
Kitas
pradėti
elementInfo.Lines.Add(Formatas('TAG : %s',[element.tagName])) ;
pabaiga ;
pabaiga ; (*Document_OnMouseOver*)
procedūra TForm1.FormCreate(Siuntėjas: TObject) ;
pradėti
WebBrowser1.Navigate('http://delphi.about.com') ;
elementInfo.Clear;
elementInfo.Lines.Add('Perkelkite pelės žymeklį ant dokumento...') ;
pabaiga ; (*FormCreate*)
procedūra TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; konst pDisp: IDispatch; buvo URL, Flags, TargetFrameName, PostData, Antraštės: OleVariant; buvo Atšaukti: WordBool) ;
pradėti
htmlDoc := nulis ;
pabaiga ; (*Web Browser1BeforeNavigate2*)
procedūra TForm1.WebBrowser1DocumentComplete(ASender: TObject; konst pDisp: IDispatch; buvo URL: OleVariant) ;
pradėti
jeigu Priskirta (žiniatinklio naršyklė1.dokumentas) tada
pradėti
htmlDoc := WebBrowser1.Document kaip HTMLDocument2;
htmlDoc.onmouseover := (TEventObject.Create(Document_OnMouseOver) kaip ID išsiuntimas);
pabaiga ;
pabaiga ; (*Web Browser1DocumentComplete*)
{ TEventObject }
konstruktorius TEventObject.Create( konst OnEvent: TObjectProcedure) ;
pradėti
paveldėtas Sukurti;
FOnEvent := OneEvent;
pabaiga ;
funkcija TEventObject.GetIDsOfNames( konst IID: TGUID; Vardai: Rodyklė; NameCount, LocaleID: Integer; DispID: Rodyklė): HResult;
pradėti
Rezultatas := E_NOTIMPL;
pabaiga ;
funkcija TEventObject.GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult;
pradėti
Rezultatas := E_NOTIMPL;
pabaiga ;
funkcija TEventObject.GetTypeInfoCount(out Count: Integer): HResult;
pradėti
Rezultatas := E_NOTIMPL;
pabaiga ;
funkcija TEventObject.Invoke(DispID: Integer; konst IID: TGUID; Lokalės ID: sveikasis skaičius; Vėliavos: Word; buvo Paramos; VarResult, ExcepInfo, ArgErr: Rodyklė): HResult;
pradėti
jeigu (DispID = DISPID_VALUE) tada
pradėti
jeigu Priskirta (FOnEvent) tada FOnEvent;
Rezultatas := S_OK;
pabaiga
Kitas Rezultatas := E_NOTIMPL;
pabaiga ;
pabaiga .