以前にも同じ質問のスレがありまして
そこを見てやってみたのですがうまく動作しません。
>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'の場所が変わってしまったのでしょうか?
誰かご存知の方教えてください
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 等を通じた
明示的な解放操作が必要となります。
ツイート | ![]() |