Computerwissenschaften

Rufen Sie die URL eines Hyperlinks in einem TWebBrowser-Dokument ab

Die TWebBrowser Delphi-Komponente bietet Zugriff auf die Webbrowser-Funktionen Ihrer Delphi-Anwendungen.

In den meisten Situationen verwenden Sie den TWebBrowser, um dem Benutzer HTML-Dokumente anzuzeigen und so Ihre eigene Version des Webbrowsers (Internet Explorer) zu erstellen. Beachten Sie, dass der TWebBrowser beispielsweise auch Word-Dokumente anzeigen kann.

Eine sehr schöne Funktion eines Browsers ist die Anzeige von Linkinformationen, beispielsweise in der Statusleiste, wenn Sie mit der Maus über einen Link in einem Dokument fahren.

Der TWebBrowser macht kein Ereignis wie „OnMouseMove“ verfügbar. Selbst wenn ein solches Ereignis existieren würde, würde es für die TWebBrowser-Komponente ausgelöst – NICHT für das Dokument, das im TWebBrowser angezeigt wird.

Um solche Informationen (und vieles mehr, wie Sie gleich sehen werden) in Ihrer Delphi-Anwendung mithilfe der TWebBrowser-Komponente bereitzustellen, muss eine Technik namens “ Ereignisse sinken “ implementiert werden.

 

WebBrowser Event Sink

Um mit der TWebBrowser-Komponente zu einer Webseite zu navigieren, rufen Sie die Navigate- Methode auf. Die Document- Eigenschaft des TWebBrowser gibt einen IHTMLDocument2- Wert zurück (für Webdokumente). Diese Schnittstelle wird verwendet, um Informationen zu einem Dokument abzurufen, die HTML-Elemente und den Text im Dokument zu untersuchen und zu ändern sowie verwandte Ereignisse zu verarbeiten.

Um das „href“ -Attribut (Link) eines „a“ -Tags in einem Dokument abzurufen, während die Maus über einem Dokument bewegt wird, müssen Sie auf das „onmousemove“ -Ereignis des IHTMLDocument2 reagieren.

Führen Sie die folgenden Schritte aus, um Ereignisse für das aktuell geladene Dokument zu löschen:

  1. Sinken Sie die Ereignisse des WebBrowser- Steuerelements in das vom TWebBrowser ausgelöste DocumentComplete- Ereignis. Dieses Ereignis wird ausgelöst, wenn das Dokument vollständig in den Webbrowser geladen ist.
  2. Rufen Sie in DocumentComplete das Dokumentobjekt des WebBrowser ab und versenken Sie die HtmlDocumentEvents-Schnittstelle.
  3. Behandeln Sie die Veranstaltung, an der Sie interessiert sind.
  4. Löschen Sie die Senke in BeforeNavigate2 – dann wird das neue Dokument in den Webbrowser geladen.

 

HTML-Dokument OnMouseMove

Da wir uns für das HREF-Attribut eines A-Elements interessieren – um die URL eines Links anzuzeigen, über dem sich die Maus befindet, wird das Ereignis „onmousemove“ gelöscht.

Die Prozedur zum Abrufen des Tags (und seiner Attribute) „unter“ der Maus kann wie folgt definiert werden:

 varhtmlDoc : IHTMLDocument2;
...
procedure TForm1.Document_OnMouseOver;
var element : IHTMLElement;
begin if htmlDoc=nil then Exit; element := htmlDoc.parentWindow.event.srcElement; elementInfo.Clear; if LowerCase(element.tagName)='a' then begin   ShowMessage('Link, HREF : ' + element.getAttribute('href',0)]) ; end else if LowerCase(element.tagName)='img' then begin   ShowMessage('IMAGE, SRC : ' + element.getAttribute('src',0)]) ; end else begin   elementInfo.Lines.Add(Format('TAG : %s',[element.tagName])) ; end;
end; (*Document_OnMouseOver*)

Wie oben erläutert, hängen wir das Ereignis onmousemove eines Dokuments im Ereignis OnDocumentComplete eines TWebBrowser an:

 procedure TForm1.WebBrowser1DocumentComplete(   ASender: TObject;const pDisp: IDispatch;var URL: OleVariant) ;
begin if Assigned(WebBrowser1.Document) then begin   htmlDoc := WebBrowser1.Document as IHTMLDocument2;   htmlDoc.onmouseover := (TEventObject.Create(Document_OnMouseOver) as IDispatch) ; end;
end; (*WebBrowser1DocumentComplete*)

Und hier entstehen die Probleme! Wie Sie vielleicht erraten haben, ist das „onmousemove“ -Ereignis * kein * normales Ereignis – genau wie die, mit denen wir in Delphi arbeiten.

Der „onmousemove“ erwartet einen Zeiger auf eine Variable vom Typ VARIANT vom Typ VT_DISPATCH, die die IDispatch-Schnittstelle eines Objekts mit einer Standardmethode empfängt, die beim Auftreten des Ereignisses aufgerufen wird.

Um eine Delphi-Prozedur an „onmousemove“ anzuhängen, müssen Sie einen Wrapper erstellen, der IDispatch implementiert und Ihr Ereignis in seiner Invoke-Methode auslöst.

Hier ist die TEventObject-Oberfläche:

 TEventObject=class(TInterfacedObject, IDispatch)
private FOnEvent: TObjectProcedure;
protected function GetTypeInfoCount(out Count: Integer): HResult; stdcall; function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall; function GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall; function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
public constructor Create(const OnEvent: TObjectProcedure) ; property OnEvent: TObjectProcedure read FOnEvent write FOnEvent; end;

Hier erfahren Sie, wie Sie die Ereignissenkung für ein Dokument implementieren, das von der TWebBrowser-Komponente angezeigt wird, und die Informationen eines HTML-Elements unter der Maus abrufen.

 

Beispiel für das Versenken von TWebBrowser-Dokumentereignissen

Herunterladen

Legen Sie einen TWebBrowser („WebBrowser1“) in einem Formular („Form1“) ab. Fügen Sie ein TMemo („elementInfo“) hinzu …

Einheit Einheit1;

Schnittstelle

verwendet
Windows, Nachrichten, SysUtils, Varianten, Klassen, Grafiken, Steuerelemente, Formulare,
Dialoge, OleCtrls, SHDocVw, MSHTML, ActiveX, StdCtrls;

Typ
TObjectProcedure=Prozedur des Objekts ;

TEventObject=Klasse (TInterfacedObject, IDispatch)
private
FOnEvent: TObjectProcedure;
geschützte
Funktion GetTypeInfoCount (out Count: Integer): HResult; stdcall;
Funktion GetTypeInfo (Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
Funktion GetIDsOfNames ( const IID: TGUID; Namen: Zeiger; NameCount, LocaleID: Integer; DispIDs: Zeiger): HResult; stdcall;
Funktion Invoke (DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
öffentlicher
Konstruktor Create ( const OnEvent: TObjectProcedure);
Eigenschaft OnEvent: TObjectProcedure read FOnEvent write FOnEvent;
Ende ;

TForm1=Klasse (TForm)
WebBrowser1: TWebBrowser;
elementInfo: TMemo;
Prozedur WebBrowser1BeforeNavigate2 (ASender: TObject; const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, Header: OleVariant; var Cancel: WordBool);
Prozedur WebBrowser1DocumentComplete (ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
Prozedur FormCreate (Absender: TObject);
private
Prozedur Document_OnMouseOver;
Öffentlichkeit
{ öffentliche Erklärungen}
Ende ;

var
Form1: TForm1;

htmlDoc: IHTMLDocument2;

Implementierung

{$ R * .dfm}

Prozedur TForm1.Document_OnMouseOver;
var
element: IHTMLElement;
begin
wenn htmlDoc=nil dann Exit;

element:=htmlDoc.parentWindow.event.srcElement;

elementInfo.Clear;

Wenn LowerCase (element.tagName)=’a‘, dann
beginne
elementInfo.Lines.Add (‚LINK info …‘);
elementInfo.Lines.Add (Format (‚HREF:% s‘, [element.getAttribute (‚href‘, 0)]));
end
else wenn LowerCase (element.tagName)=’img‘, dann
beginne
elementInfo.Lines.Add (‚IMAGE info …‘);
elementInfo.Lines.Add (Format (‚SRC:% s‘, [element.getAttribute (’src‘, 0)]));
end
else
begin
elementInfo.Lines.Add (Format (‚TAG:% s‘, [element.tagName]));
Ende ;
Ende ; (* Document_OnMouseOver *)

procedure TForm1.FormCreate (Sender: TObject);
begin
WebBrowser1.Navigate (‚http://delphi.about.com‘);

elementInfo.Clear;
elementInfo.Lines.Add (‚Bewegen Sie die Maus über das Dokument …‘);
Ende ; (* FormCreate *)

Prozedur TForm1.WebBrowser1BeforeNavigate2 (ASender: TObject; const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, Header: OleVariant; var Cancel: WordBool);
begin
htmlDoc:=nil ;
Ende ; (* WebBrowser1BeforeNavigate2 *)

Prozedur TForm1.WebBrowser1DocumentComplete (ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
begin
if Assigned (WebBrowser1.Document) dann
beginne
htmlDoc:=WebBrowser1.Document als IHTMLDocument2;

htmlDoc.onmouseover:=(TEventObject.Create (Document_OnMouseOver) als IDispatch);
Ende ;
Ende ; (* WebBrowser1DocumentComplete *)

{} TEventObject

Konstruktor TEventObject.Create ( const OnEvent: TObjectProcedure);
begin
geerbt erstellen;
FOnEvent:=OnEvent;
Ende ;

Funktion TEventObject.GetIDsOfNames (const IID: TGUID; Namen: Zeiger; NameCount, LocaleID: Integer; DispIDs: Zeiger): HResult;
begin
Ergebnis:=E_NOTIMPL;
Ende ;

Funktion TEventObject.GetTypeInfo (Index, LocaleID: Integer; out TypeInfo): HResult;
begin
Ergebnis:=E_NOTIMPL;
Ende ;

Funktion TEventObject.GetTypeInfoCount (out Count: Integer): HResult;
begin
Ergebnis:=E_NOTIMPL;
Ende ;

Funktion TEventObject.Invoke (DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult;
begin
if (DispID=DISPID_VALUE) dann
begin
if Assigned (FOnEvent) then FOnEvent;
Ergebnis:=S_OK;
end
else Ergebnis:=E_NOTIMPL;
Ende ;

Ende .

Similar Posts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.