Få URL-en til en hyperkobling når musen beveger seg over et TWebBrowser-dokument
DeTWebBrowserDelphi-komponenten gir tilgang til nettleserfunksjonaliteten fra dine Delphi-applikasjoner.
I de fleste situasjoner bruker du TWebBrowser til å vise HTML-dokumenter til brukeren - og lager dermed din egen versjon av (Internet Explorer) nettleseren. Merk at TWebBrowser også kan vise Word-dokumenter, for eksempel.
En veldig fin funksjon i en nettleser er å vise koblingsinformasjon, for eksempel i statuslinjen, når musen holder musen over en lenke i et dokument.
TWebBrowser viser ikke en hendelse som 'OnMouseMove'. Selv om en slik hendelse ville eksistere, vil den bli utløst for TWebBrowser-komponenten - IKKE for dokumentet som vises inne i TWebBrowser.
For å gi slik informasjon (og mye mer, som du vil se om et øyeblikk) i Delphi-applikasjonen din ved å bruke TWebBrowser-komponenten, en teknikk kalt ' hendelser synker ' må gjennomføres.
WebBrowser Event Sink
For å navigere til en nettside ved å bruke TWebBrowser-komponenten kaller du Navigere metode. De Dokument egenskapen til TWebBrowser returnerer en HTMLDokument2 verdi (for nettdokumenter). Dette grensesnittet brukes til å hente informasjon om et dokument, for å undersøke og endre HTML-elementene og teksten i dokumentet, og til å behandle relaterte hendelser.
For å få 'href'-attributtet (lenke) til en 'a'-tag i et dokument, mens musen svever over et dokument, må du reagere på 'onmousemove'-hendelsen i IHTMLDocument2.
Her er trinnene for å senke hendelser for dokumentet som er lastet inn:
- Senk WebBrowser-kontrollens hendelser i DocumentComplete begivenhet reist av TWebBrowser. Denne hendelsen utløses når dokumentet er fullstendig lastet inn i nettleseren.
- Inne i DocumentComplete, hente WebBrowsers dokumentobjekt og senke HtmlDocumentEvents-grensesnittet.
- Håndter arrangementet du er interessert i.
- Tøm vasken i innsiden FørNaviger2 - det er når det nye dokumentet lastes inn i nettleseren.
HTML-dokument OnMouseMove
Siden vi er interessert i HREF-attributtet til et A-element - for å vise URL-en til en lenke musen er over, vil vi senke 'onmousemove'-hendelsen.
Prosedyren for å få taggen (og dens attributter) 'under' musen kan defineres som:
|_+_|
Som forklart ovenfor, legger vi til onmousemove-hendelsen til et dokument i OnDocumentComplete-hendelsen til en TWebBrowser:
|_+_|Og det er her problemene oppstår! Som du kanskje gjetter er 'onmousemove'-hendelsen *ikke* en vanlig hendelse - det samme er de vi er vant til å jobbe med i Delphi.
'onmousemove' forventer en peker til en variabel av typen VARIANT av typen VT_DISPATCH som mottar IDispatch-grensesnittet til et objekt med en standardmetode som påkalles når hendelsen inntreffer.
For å knytte en Delphi-prosedyre til 'onmousemove' må du lage en wrapper som implementerer IDispatch og hever hendelsen din i Invoke-metoden.
Her er TEventObject-grensesnittet:
|_+_|Slik implementerer du hendelsesanking for et dokument som vises av TWebBrowser-komponenten - og får informasjon om et HTML-element under musen.
Eksempel på TWebBrowser-dokumenthendelse
nedlasting
Slipp en TWebBrowser ('WebBrowser1') på et skjema ('Form1'). Legg til en TMemo ('elementInfo')...
enhet enhet 1;
grensesnitt
bruker
Windows, meldinger, SysUtils, varianter, klasser, grafikk, kontroller, skjemaer,
Dialoger, OleCtrls, SHDocVw, MSHTML, ActiveX, StdCtrls;
type
TObjectProcedure = fremgangsmåte av gjenstand ;
TEventObject = klasse (TInterfacedObject, IDispatch)
privat
FOnEvent: TObjectProcedure;
beskyttet
funksjon GetTypeInfoCount(out Count: Heltall): HResult; stdcall;
funksjon GetTypeInfo(Index, LocaleID: Heltall; ut TypeInfo): HResult; stdcall;
funksjon GetIDsOfNames( konst IID: TGUID; Navn: Peker; NameCount, LocaleID: Heltall; DispIDer: Peker): HResult; stdcall;
funksjon Invoke(DispID: Heltall; konst IID: TGUID; LocaleID: Heltall; Flagg: Ord; var Params; VarResult, ExcepInfo, ArgErr: Peker): HResult; stdcall;
offentlig
konstruktør Skape( konst OnEvent: TObjectProcedure) ;
eiendom OnEvent: TObjectProcedure les FOnEvent skriv FOnEvent;
slutt ;
TForm1 = klasse (TForm)
WebBrowser1: TWebBrowser;
elementInfo: TMemo;
fremgangsmåte WebBrowser1BeforeNavigate2(ASender: TObject; konst pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, Headers: OleVariant; var Avbryt: WordBool) ;
fremgangsmåte WebBrowser1DocumentComplete(ASender: TObject; konst pDisp: IDispatch; var URL: OleVariant) ;
fremgangsmåte FormCreate(Sender: TObject) ;
privat
fremgangsmåte Document_OnMouseOver;
offentlig
{ Offentlig erklæringer }
slutt ;
var
Form1: TForm1;
htmlDoc : IHTMLDocument2;
gjennomføring
{$R *.dfm}
fremgangsmåte TForm1.Document_OnMouseOver;
var
element : IHTMLElement;
begynne
hvis htmlDok = null deretter Exit;
element := htmlDoc.parentWindow.event.srcElement;
elementInfo.Clear;
hvis LowerCase(element.tagName) = 'a' deretter
begynne
elementInfo.Lines.Add('LINK info...') ;
elementInfo.Lines.Add(Format('HREF: %s',[element.getAttribute('href',0)])));
slutt
ellers hvis LowerCase(element.tagName) = 'img' deretter
begynne
elementInfo.Lines.Add('IMAGE info...') ;
elementInfo.Lines.Add(Format('SRC: %s',[element.getAttribute('src',0)])));
slutt
ellers
begynne
elementInfo.Lines.Add(Format('TAG : %s',[element.tagName])) ;
slutt ;
slutt ; (*Document_OnMouseOver*)
fremgangsmåte TForm1.FormCreate(Sender: TObject) ;
begynne
WebBrowser1.Navigate('http://delphi.about.com') ;
elementInfo.Clear;
elementInfo.Lines.Add('Flytt musen over dokumentet...') ;
slutt ; (*FormCreate*)
fremgangsmåte TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; konst pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, Headers: OleVariant; var Avbryt: WordBool) ;
begynne
htmlDoc := null ;
slutt ; (*WebBrowser1BeforeNavigate2*)
fremgangsmåte TForm1.WebBrowser1DocumentComplete(ASender: TObject; konst pDisp: IDispatch; var URL: OleVariant) ;
begynne
hvis Tildelt (WebBrowser1.Document) deretter
begynne
htmlDoc := WebBrowser1.Document som HTMLDokument2;
htmlDoc.onmouseover := (TEventObject.Create(Document_OnMouseOver) som IDispatch) ;
slutt ;
slutt ; (*WebBrowser1DocumentComplete*)
{ TEventObject }
konstruktør TEventObject.Create( konst OnEvent: TObjectProcedure) ;
begynne
arvet Skape;
FOnEvent := OnEvent;
slutt ;
funksjon TEventObject.GetIDsOfNames( konst IID: TGUID; Navn: Peker; NameCount, LocaleID: Heltall; DispIDer: Peker): HResult;
begynne
Resultat := E_NOTIMPL;
slutt ;
funksjon TEventObject.GetTypeInfo(Index, LocaleID: Heltall; ut TypeInfo): HResult;
begynne
Resultat := E_NOTIMPL;
slutt ;
funksjon TEventObject.GetTypeInfoCount(out Count: Heltall): HResult;
begynne
Resultat := E_NOTIMPL;
slutt ;
funksjon TEventObject.Invoke(DispID: Heltall; konst IID: TGUID; LocaleID: Heltall; Flagg: Ord; var Params; VarResult, ExcepInfo, ArgErr: Peker): HResult;
begynne
hvis (DispID = DISPID_VALUE) deretter
begynne
hvis Tildelt (FOnEvent) deretter FOnEvent;
Resultat := S_OK;
slutt
ellers Resultat := E_NOTIMPL;
slutt ;
slutt .