Uzyskaj adres URL hiperłącza, gdy mysz porusza się nad dokumentem TWebBrowser





TheTWebPrzeglądarkaKomponent Delphi zapewnia dostęp do funkcjonalności przeglądarki internetowej z aplikacji Delphi.

W większości sytuacji używasz przeglądarki TWebBrowser do wyświetlania użytkownikowi dokumentów HTML - tworząc w ten sposób własną wersję przeglądarki internetowej (Internet Explorer). Zauważ, że TWebBrowser może również wyświetlać na przykład dokumenty Worda.



Bardzo fajną funkcją przeglądarki jest wyświetlanie informacji o łączu, na przykład na pasku stanu, gdy wskaźnik myszy znajduje się nad łączem w dokumencie.

TWebBrowser nie ujawnia zdarzenia takiego jak „OnMouseMove”. Nawet gdyby takie zdarzenie zaistniało, zostałoby wywołane dla komponentu TWebBrowser - NIE dla dokumentu wyświetlanego wewnątrz TWebBrowser.



Aby zapewnić takie informacje (i wiele więcej, jak za chwilę zobaczysz) w swojej aplikacji Delphi za pomocą komponentu TWebBrowser, techniki zwanej ' wydarzenia toną ' musi być zaimplementowana.

WebBrowser Event Sink

Aby przejść do strony internetowej za pomocą komponentu TWebBrowser, nazywasz Nawigować metoda. The Dokument właściwość TWebBrowser zwraca an Dokument HTML2 wartość (dla dokumentów internetowych). Ten interfejs służy do pobierania informacji o dokumencie, badania i modyfikowania elementów HTML i tekstu w dokumencie oraz przetwarzania powiązanych zdarzeń.

Aby uzyskać atrybut „href” (link) znacznika „a” wewnątrz dokumentu, gdy wskaźnik myszy znajduje się nad dokumentem, musisz zareagować na zdarzenie „onmousemove” w IHTMLDocument2.

Oto kroki umożliwiające zatopienie zdarzeń dla aktualnie załadowanego dokumentu:



  1. Zanurz zdarzenia kontrolki WebBrowser w Dokument ukończony zdarzenie wywołane przez TWebBrowser. To zdarzenie jest uruchamiane, gdy dokument zostanie w pełni załadowany do przeglądarki internetowej.
  2. Wewnątrz DocumentComplete pobierz obiekt dokumentu przeglądarki WebBrowser i zatop interfejs HtmlDocumentEvents.
  3. Zajmij się wydarzeniem, które Cię interesuje.
  4. Wyczyść zlew w w Przed nawigacją2 - wtedy nowy dokument jest ładowany w przeglądarce internetowej.

Dokument HTML OnMouseMove

Ponieważ interesuje nas atrybut HREF elementu A - aby pokazać adres URL linku, po najechaniu myszką, zatopimy zdarzenie 'onmousemove'.

Procedurę pobrania znacznika (i jego atrybutów) „pod” myszą można zdefiniować jako:



|_+_|

Jak wyjaśniono powyżej, dołączamy do zdarzenia onmousemove dokumentu w zdarzeniu OnDocumentComplete przeglądarki TWebBrowser:

|_+_|

I tu pojawiają się problemy! Jak można się domyślić, wydarzenie 'onmousemove' *nie* jest zwykłym wydarzeniem - podobnie jak te, z którymi jesteśmy przyzwyczajeni do pracy w Delphi.



'onmousemove' oczekuje wskaźnika do zmiennej typu VARIANT typu VT_DISPATCH, która odbiera interfejs IDispatch obiektu z domyślną metodą, która jest wywoływana po wystąpieniu zdarzenia.

Aby dołączyć procedurę Delphi do 'onmousemove', musisz stworzyć wrapper, który implementuje IDispatch i podnosi twoje zdarzenie w swojej metodzie Invoke.



Oto interfejs TEventObject:

|_+_|

Oto jak zaimplementować pochłanianie zdarzeń dla dokumentu wyświetlanego przez komponent TWebBrowser - i uzyskać informacje o elemencie HTML pod myszą.

Przykład zatonięcia zdarzenia TWebBrowser w dokumencie

Ściągnij

Upuść TWebBrowser („WebBrowser1”) na formularz („Form1”). Dodaj TMemo ('elementInfo')...

jednostka rozdział 1;

interfejs

używa
Windows, komunikaty, narzędzia SysUtils, warianty, klasy, grafika, kontrolki, formularze,
Okna dialogowe, OleCtrls, SHDocVw, MSHTML, ActiveX, StdCtrls;

rodzaj
TOProcedura obiektu = procedura z obiekt ;

TEventObject = klasa (TInterfacedObject, IDispatch)
prywatny
FOnEvent: TObjectProcedure;
chroniony
funkcjonować GetTypeInfoCount(out Count: Integer): HResult; wywołanie standardowe;
funkcjonować GetTypeInfo(Indeks, LocaleID: Integer; out TypeInfo): HResult; wywołanie standardowe;
funkcjonować PobierzIDNazw( stały IID: TGUID; Nazwy: wskaźnik; NameCount, LocaleID: liczba całkowita; DispIDs: Wskaźnik): HResult; wywołanie standardowe;
funkcjonować Invoke(DispID: Integer; stały IID: TGUID; LocaleID: liczba całkowita; Flagi: słowo; był parametry; VarResult, ExcepInfo, ArgErr: wskaźnik): HResult; wywołanie standardowe;
publiczny
konstruktor Tworzyć( stały Zdarzenie: TObjectProcedure) ;
własność OnEvent: TObjectProcedure odczyt FOnEvent zapis FOnEvent;
koniec ;

TForm1 = klasa (Formularz)
WebBrowser1: TWebBrowser;
elementInfo: TMemo;
procedura WebBrowser1BeforeNavigate2(ASender: TObject; stały pDisp: IDWysył.; był URL, Flagi, TargetFrameName, PostData, Nagłówki: OleVariant; był Anuluj: WordBool) ;
procedura WebBrowser1DocumentComplete(ASender: TObject; stały pDisp: IDWysył.; był URL: OleWariant) ;
procedura FormCreate(Nadawca: TObject) ;
prywatny
procedura Document_OnMouseOver;
publiczny
{ Publiczny deklaracje }
koniec ;

był
Form1: TForm1;

htmlDoc : IHTMLDocument2;

realizacja

{$R *.dfm}

procedura TForm1.Document_OnMouseOver;
był
element : IHTMLElement;
zaczynać
jeśli htmlDokument = zero następnie Wyjście;

element := htmlDoc.parentWindow.event.srcElement;

elementInfo.Wyczyść;

jeśli Małe litery(element.nazwaznacznika) = 'a' następnie
zaczynać
elementInfo.Lines.Add('Informacje o łączu...') ;
elementInfo.Lines.Add(Format('HREF : %s',[element.getAttribute('href',0)])) ;
koniec
w przeciwnym razie jeśli Małe litery(element.nazwaznacznika) = 'img' następnie
zaczynać
elementInfo.Lines.Add('INFORMACJE O OBRAZU...') ;
elementInfo.Lines.Add(Format('SRC : %s',[element.getAttribute('src',0)])) ;
koniec
w przeciwnym razie
zaczynać
elementInfo.Lines.Add(Format('ZNACZNIK: %s',[element.nazwaznacznika])) ;
koniec ;
koniec ; (*Document_OnMouseOver*)


procedura TForm1.FormCreate(Nadawca: TObject) ;
zaczynać
WebBrowser1.Navigate('http://delphi.about.com') ;

elementInfo.Wyczyść;
elementInfo.Lines.Add('Najedź myszką na dokument...') ;
koniec ; (*Utwórz formularz*)

procedura TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; stały pDisp: IDWysył.; był URL, Flagi, TargetFrameName, PostData, Nagłówki: OleVariant; był Anuluj: WordBool) ;
zaczynać
htmlDokument := zero ;
koniec ; (*Przeglądarka internetowa1Przed nawigacją2*)

procedura TForm1.WebBrowser1DocumentComplete(ASender: TObject; stały pDisp: IDWysył.; był URL: OleWariant) ;
zaczynać
jeśli Przypisane (WebBrowser1.Document) następnie
zaczynać
htmlDoc := przeglądarka internetowa1.Dokument jak Dokument HTML2;

htmlDoc.onmouseover := (TEventObject.Create(Document_OnMouseOver) jak IDWyślij) ;
koniec ;
koniec ; (*Przeglądarka internetowa1Dokument kompletny*)


{ ObiektWydarzenia }

konstruktor TEventObject.Create( stały Zdarzenie: TObjectProcedure) ;
zaczynać
dziedziczny Tworzyć;
FOnEvent := OneEvent;
koniec ;

funkcjonować TEventObject.GetIDsOfNames( stały IID: TGUID; Nazwy: wskaźnik; NameCount, LocaleID: liczba całkowita; DispIDs: Wskaźnik): HResult;
zaczynać
Wynik := E_NOTIMPL;
koniec ;

funkcjonować TEventObject.GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult;
zaczynać
Wynik := E_NOTIMPL;
koniec ;

funkcjonować TEventObject.GetTypeInfoCount(out Count: Integer): HResult;
zaczynać
Wynik := E_NOTIMPL;
koniec ;

funkcjonować TEventObject.Invoke(DispID: liczba całkowita; stały IID: TGUID; LocaleID: liczba całkowita; Flagi: słowo; był parametry; VarResult, ExcepInfo, ArgErr: wskaźnik): HResult;
zaczynać
jeśli (DispID = DISPID_VALUE) następnie
zaczynać
jeśli Przypisane (FOnEvent) następnie FOnEvent;
Wynik := S_OK;
koniec
w przeciwnym razie Wynik := E_NOTIMPL;
koniec ;

koniec .