マウスが TWebBrowser ドキュメント上を移動したときにハイパーリンクの URL を取得する





のTWebBrowserDelphi コンポーネントは、Delphi アプリケーションから Web ブラウザ機能へのアクセスを提供します。

ほとんどの場合、TWebBrowser を使用して HTML ドキュメントをユーザーに表示します。つまり、独自のバージョンの (Internet Explorer) Web ブラウザーを作成します。 TWebBrowser は、たとえば Word 文書も表示できることに注意してください。



ブラウザの非常に優れた機能は、ドキュメント内のリンクの上にマウスを置いたときに、たとえばステータス バーにリンク情報を表示することです。

TWebBrowser は「OnMouseMove」のようなイベントを公開しません。そのようなイベントが存在する場合でも、TWebBrowser コンポーネントに対して発生します。TWebBrowser 内に表示されているドキュメントに対してではありません。



TWebBrowser コンポーネントを使用して Delphi アプリケーションでそのような情報(およびすぐにわかるように、さらに多くの情報)を提供するには、「 イベント沈没 ' を実装する必要があります。

WebBrowser イベント シンク

TWebBrowser コンポーネントを使用して Web ページに移動するには、 ナビゲート 方法。の 書類 TWebBrowser のプロパティは HTMLDocument2 値 (Web ドキュメントの場合)。このインターフェイスは、ドキュメントに関する情報の取得、ドキュメント内の HTML 要素とテキストの調査と変更、および関連イベントの処理に使用されます。

ドキュメント内の 'a' タグの 'href' 属性 (リンク) を取得するには、マウスがドキュメントの上にあるときに、IHTMLDocument2 の 'onmousemove' イベントに反応する必要があります。

現在読み込まれているドキュメントのイベントをシンクする手順は次のとおりです。



  1. WebBrowser コントロールのイベントを ドキュメント完了 TWebBrowser によって発生するイベント。このイベントは、ドキュメントが Web ブラウザに完全に読み込まれたときに発生します。
  2. DocumentComplete 内で、WebBrowser のドキュメント オブジェクトを取得し、HtmlDocumentEvents インターフェイスをシンクします。
  3. 興味のあるイベントを処理します。
  4. でシンクをクリア BeforeNavigate2 - これは、新しいドキュメントが Web ブラウザにロードされたときです。

HTML ドキュメント OnMouseMove

A 要素の HREF 属性に関心があるため、マウスが置かれているリンクの URL を表示するために、「onmousemove」イベントをシンクします。

マウスの「下」にあるタグ (およびその属性) を取得する手順は、次のように定義できます。



|_+_|

上で説明したように、TWebBrowser の OnDocumentComplete イベントでドキュメントの onmousemove イベントにアタッチします。

|_+_|

そして、ここで問題が発生します!ご想像のとおり、「onmousemove」イベントは通常のイベントではありません。Delphi での作業に慣れているものです。



'onmousemove' は、イベントが発生したときに呼び出される既定のメソッドを持つオブジェクトの IDispatch インターフェイスを受け取る、VT_DISPATCH 型の VARIANT 型の変数へのポインターを想定しています。

Delphi プロシージャを「onmousemove」にアタッチするには、IDispatch を実装し、その Invoke メソッドでイベントを発生させるラッパーを作成する必要があります。



TEventObject インターフェイスは次のとおりです。

|_+_|

TWebBrowser コンポーネントによって表示されるドキュメントのイベント シンクを実装し、マウスの下にある HTML 要素の情報を取得する方法を次に示します。

TWebBrowser ドキュメント イベント シンクの例

ダウンロード

TWebBrowser ('WebBrowser1') をフォーム ('Form1') にドロップします。 TMemo ('elementInfo') を追加...

単位 ユニット1;

インターフェース

用途
Windows、メッセージ、SysUtils、バリアント、クラス、グラフィックス、コントロール、フォーム、
ダイアログ、OleCtrls、SHDocVw、MSHTML、ActiveX、StdCtrls;

タイプ
TObjectProcedure = 手順 物体 ;

TEventObject = クラス (TInterfacedObject、IDispatch)
プライベート
FOnEvent: TObjectProcedure;
保護された
関数 GetTypeInfoCount (アウト カウント: 整数): HResult; stdcall;
関数 GetTypeInfo (インデックス、LocaleID: 整数; TypeInfo から): HResult; stdcall;
関数 GetIDsOfNames( 定数 IID: TGUID;名前: ポインター。 NameCount、LocaleID: 整数。 DispIDs: ポインター): HResult; stdcall;
関数 Invoke(DispID: 整数; 定数 IID: TGUID; LocaleID: 整数。フラグ: 単語; だった パラメータ; VarResult、ExcepInfo、ArgErr: ポインター): HResult; stdcall;
公衆
コンストラクタ 作成( 定数 OnEvent: TObjectProcedure) ;
財産 OnEvent: TObjectProcedure 読み取り FOnEvent 書き込み FOnEvent;
終わり ;

TForm1 = クラス (Tフォーム)
WebBrowser1: TWebBrowser;
elementInfo: TMemo;
手順 WebBrowser1BeforeNavigate2(ASender: TObject; 定数 pDisp: IDispatch; だった URL、フラグ、TargetFrameName、PostData、ヘッダー: OleVariant; だった キャンセル: WordBool) ;
手順 WebBrowser1DocumentComplete(ASender: TObject; 定数 pDisp: IDispatch; だった URL: OleVariant) ;
手順 FormCreate(送信者: TObject) ;
プライベート
手順 Document_OnMouseOver;
公衆
{ 公衆 宣言}
終わり ;

だった
Form1: TForm1;

htmlDoc : IHTMLDocument2;

実装

{$R *.dfm}

手順 TForm1.Document_OnMouseOver;
だった
要素: IHTMLElement;
始める
もしも htmlDoc = なし それから 出口;

要素:= htmlDoc.parentWindow.event.srcElement;

elementInfo.Clear;

もしも LowerCase(element.tagName) = 'a' それから
始める
elementInfo.Lines.Add('リンク情報...') ;
elementInfo.Lines.Add(Format('HREF : %s',[element.getAttribute('href',0)])) ;
終わり
そうしないと もしも LowerCase(element.tagName) = 'img' それから
始める
elementInfo.Lines.Add('画像情報...') ;
elementInfo.Lines.Add(Format('SRC : %s',[element.getAttribute('src',0)])) ;
終わり
そうしないと
始める
elementInfo.Lines.Add(Format('TAG : %s',[element.tagName])) ;
終わり ;
終わり ; (*Document_OnMouseOver*)


手順 TForm1.FormCreate(送信者: TObject) ;
始める
WebBrowser1.Navigate('http://delphi.about.com') ;

elementInfo.Clear;
elementInfo.Lines.Add('ドキュメントの上にマウスを移動します...') ;
終わり ; (*フォーム作成*)

手順 TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; 定数 pDisp: IDispatch; だった URL、フラグ、TargetFrameName、PostData、ヘッダー: OleVariant; だった キャンセル: WordBool) ;
始める
htmlDoc := なし ;
終わり ; (*WebBrowser1BeforeNavigate2*)

手順 TForm1.WebBrowser1DocumentComplete(ASender: TObject; 定数 pDisp: IDispatch; だった URL: OleVariant) ;
始める
もしも 割り当て済み(WebBrowser1.Document) それから
始める
htmlDoc := WebBrowser1.Document なので HTMLDocument2;

htmlDoc.onmouseover := (TEventObject.Create(Document_OnMouseOver) なので IDispatch) ;
終わり ;
終わり ; (*WebBrowser1DocumentComplete*)


{ TEventObject }

コンストラクタ TEventObject.Create( 定数 OnEvent: TObjectProcedure) ;
始める
遺伝性の 作成;
FOnEvent := OnEvent;
終わり ;

関数 TEventObject.GetIDsOfNames( 定数 IID: TGUID;名前: ポインター。 NameCount、LocaleID: 整数。 DispIDs: ポインター): HResult;
始める
結果:= E_NOTIMPL;
終わり ;

関数 TEventObject.GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult;
始める
結果:= E_NOTIMPL;
終わり ;

関数 TEventObject.GetTypeInfoCount(out Count: Integer): HResult;
始める
結果:= E_NOTIMPL;
終わり ;

関数 TEventObject.Invoke(DispID: 整数; 定数 IID: TGUID; LocaleID: 整数。フラグ: 単語; だった パラメータ; VarResult、ExcepInfo、ArgErr: ポインター): HResult;
始める
もしも (DispID = DISPID_VALUE) それから
始める
もしも 割り当て済み(FOnEvent) それから FOnEvent;
結果:= S_OK;
終わり
そうしないと 結果:= E_NOTIMPL;
終わり ;

終わり .