WebBrowserのページ内の文字検索について


まぁぼお  2011-11-07 00:01:36  No: 147392

以前にも同じ質問のスレがありまして
そこを見てやってみたのですがうまく動作しません。

>Private Sub Command1_Click()
>    Dim Doc As Object       'MSHTML.HTMLDocument
>    Dim Body As Object      'MSHTML.HTMLBody
>    Dim objRange As Object  'MSHTML.IHTMLTxtRange
>    Dim BMK As String
>    
>    
>    '検索文字列を入れておいてください。
>    If Len(Text1.Text) = 0 Then Exit Sub
>    
>    Set Doc = WebBrowser1.Document
>    Set Body = Doc.Body
>    Set objRange = Body.createTextRange
>    
>    '≫≫≫≫≫ 検索開始
>    'For L = 0 To 255
>    '   If objRange.findText(Text1.Text) = False Then Exit For
>    Do While objRange.findText(Text1.Text)
>        '最初に見つかった位置を保存しておきます。
>        If Len(BMK) = 0 Then BMK = objRange.getBookmark
>        
>        '検索した語句を黄色く反転させる。
>        objRange.execCommand "BackColor", False, "YELLOW"
>        
>        '論理カーソル位置を、検索した語句の末尾に移動させる。
>        objRange.collapse False
>    Loop
>    'Next L
>    '≪≪≪≪≪ 検索終了
    
>    'ついでに、最初に見つけた語句の位置までスクロールさせています。
>    If Len(BMK) Then
>        objRange.moveToBookmark BMK
>        objRange.scrollIntoView
>    End If    
>    '最後は一応、後始末を。
>    Set objRange = Nothing
>    Set Body = Nothing
>    Set Doc = Nothing
>End Sub

このソースを参考にさせていただいたのですが
実行すると

>objRange = Body.createTextRange

この部分でエラーになり
公開メンバ 'createTextRange' は型 'HtmlElement' に見つかりませんでした。

となって動作しません。

環境は、vb.net 2010
OSは、windows 7
net.fremework 4.0

'createTextRange'の場所が変わってしまったのでしょうか?
誰かご存知の方教えてください


魔界の仮面弁士  2011-11-07 03:30:19  No: 147393

Set ステートメントが使われていることからも分かりますように、
そのコードは VB6 すなわち ActiveX 版を対象としたコードです。

そもそも、VB6 が使う ActiveX (COM) 版の WebBrowser と
VB2010 が使う .NET マネージの WebBrowser では扱いが異なります。
また HTMLDocument 型も同様で、COM 版と .NET 版は別物となります。

いずれも、内部で COM オブジェクトを使っているとはいえ、マネージ版は
COM 版のすべての機能をラッピングしているわけでは無いからです。

対処方法の一つとしては、System.Windows.Forms.WebBrowser を使うかわりに
ActiveX 版(COM 版)の WebBrowser である AxWebBrowser を使う方法があります。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200712/07120031.txt

しかしわざわざ AxWebBrowser に切り替えずとも、COM 版のインターフェイスに
キャストすることで、createTextRange メソッドを呼び出すことが可能となります。
(あるいは参照設定を追加せず、レイトバインドにて呼び出す方法もありますが、
 いずれの方法を使うにせよ、COM 版のメソッドを扱うという点では一緒です。

具体的には、マネージ版の WebBrowser には ActiveXInstance プロパティ、
HTMLDocument には DomElement プロパティ が用意されており、
これらを通じて、COM 版のオブジェクトを取得できるようになっているので、
これを利用するというものです。

たとえば、WebBrowser1.Document.DomElement を使えば、そこから 
mshtml.IHTMLDocument2 インターフェイスを得られます。
http://msdn.microsoft.com/en-us/library/system.windows.forms.htmlelement.domelement.aspx

WebBrowser1.Document.Window.DomWindow なら
mshtml.IHTMLWindow2 インターフェイスを得られます。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.htmlwindow.domwindow.aspx

同様にして、DomElement プロパティ経由で mshtml.IHTMLBodyElement を得てやれば、
そこから createTextRange メソッドを呼び出せるようになるかと思います。

なお、それ以降のコードも同様に書き換える必要がありますのでご注意ください。
たとえば VB6 では、Nothing 代入で COM オブジェクトへの参照を解放できますが、
VB.NET の場合は Nothing 代入ではなく、Marshal.ReleaseComObject 等を通じた
明示的な解放操作が必要となります。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加