VB2005とAxWebBrowserを使用してちょっとしたブラウザを作成しています。
テキストボックスに検索文字を入力し、検索ボタンをクリックすると、
AxWebBrowserに表示されているページ上で見つかった検索語句をハイライトし、
最初に見つかった位置までスクロールするというところはできたのですが、
再度、検索ボタンを押すと、ハイライトされた語句をハイライトなしに戻す
というところがうまくできません。
どのように修正したら良いのかアドバイス頂けたら幸いです。
Private Sub btnSearchWord_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearchWord.Click
Static Dim blnHighlight As Boolean = True
Dim key As String = txtSearchWrod.Text
If key = vbNullString Then Exit Sub
Dim className As String = "keyword: " & key
Dim spanStart As String = "<SPAN class=" & Chr(34) & className & Chr(34) & " style=" & Chr(34) & "background-color: #FFFF63" & Chr(34) & ">"
Dim spanEnd As String = "</SPAN>"
If blnHighlight Then
Dim doc As mshtml.IHTMLDocument2 = DirectCast(AxWebBrowser.Document, mshtml.IHTMLDocument2)
Dim body As mshtml.IHTMLBodyElement = DirectCast(doc.body, mshtml.IHTMLBodyElement)
Dim range As mshtml.IHTMLTxtRange = DirectCast(body.createTextRange(), mshtml.IHTMLTxtRange)
Dim blnFoundFirst As Boolean = True
Dim BMK As String = vbNullString
While (range.findText(key, 1, 0))
range.pasteHTML(spanStart & range.htmlText & spanEnd)
If blnFoundFirst Then
'最初に見つかった位置までスクロール
If Len(BMK) = 0 Then BMK = range.getBookmark
range.moveToBookmark(BMK)
range.scrollIntoView()
blnFoundFirst = False
End If
End While
doc = Nothing
body = Nothing
range = Nothing
Else
'Object' から 'System.Collections.IEnumerable' への暗黙的な変換です。↓というエラーがでます。
For Each he As HtmlElement In AxWebBrowser.Document.GetElementsByTagName("SPAN")
If (he.GetAttribute("className").Equals(className)) Then he.OuterHtml = he.InnerHtml
Next
End If
blnHighlight = Not blnHighlight
End If
また、ページを表示させるときに、キャッシュを読み込んでしまい、
古い情報が表示されることがあるのですが、キャッシュを読み込まずに、
常にサーバーから取得する方法はありますでしょうか?
Private Const navNoHistory As Integer = &H2
AxWebBrowser.Navigate(strUrl, navNoHistory, vbNullString, vbNullString, vbNullString)
としていますが、キャッシュを読み込んでしまいます。
以上、宜しくお願い致しますm(_ _)m
DeleteUrlCacheEntry APIでしょうか
編集 削除はじめに、載せたコードのTab(インデント)が削除されてしまい、
見にくくなってしまい申し訳ございません。
通ってみたさん、レスありがとうございます。
ページを読み込むための以下の関数を作成し、この関数を実行し
ページを読み込むようにしたところ、
常にサーバーからページを取得するようになり、
この問題は解決できそうです。
ありがとうございます。
'ファイルが存在した場合にキャッシュから関連したファイルを削除する
Private Declare Function DeleteUrlCacheEntry Lib "wininet" _
Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Integer
Public Sub myPageLoad(ByVal awb As AxSHDocVw.AxWebBrowser, ByVal strUrl As String)
Const navNoHistory As Integer = &H2
Dim strUrlTemp As String = strUrl
If strUrl <> vbNullString Then
'キャッシュが存在する場合はキャッシュを削除する
If DeleteUrlCacheEntry(strUrl) <> 0 Then
Debug.Print(Format(Now, "yyyy/MM/dd HH:mm:ss") & " ○Del : " & strUrl)
Else
Debug.Print(Format(Now, "yyyy/MM/dd HH:mm:ss") & " ●Non : " & strUrl)
End If
End If
awb.Navigate(strUrlTemp, navNoHistory, vbNullString, vbNullString, vbNullString)
End Sub
ただ、ちょっと気になったのが、DeleteUrlCacheEntry(strUrl) を実行すると
strUrl の内容が変わってしまうことがあることです。
例えば、
strUrl = "http://www.google.com/search?num=50&lr=lang_ja&q=テスト"
となっていた場合に、
DeleteUrlCacheEntry(strUrl)
を実行後、
strUrl = "http://www.google.com/search?num=50&lr=lang_ja&q=テ"
に置き換わり、awb.Navigate に strUrl を渡してしまうと、
googleでは、"テ"として検索が行われてしまいます。
DeleteUrlCacheEntry への引数は ByVal(値渡し)で宣言しているのに、
ByRef(参照渡し)で渡されているのが気になりました。
とりあえず、DeleteUrlCacheEntry(strUrl)を行う前に、
strUrlTemp という変数に strUrl をコピーし、
awb.Navigate に strUrlTemp を渡すことで回避しました。
もう一方のページ内の検索語句をハイライトした後に、ハイライトなしに戻す方法ですが、
上のコードはC#で書かれていたコードをVB2005へ無理やり書き換えたものなのですが、
For Each he As HtmlElement In AxWebBrowser.Document.GetElementsByTagName
の部分の書き換え方が間違っているようで、
いろいろ試行錯誤していますが、いまだに悩んでおります。
ネットでいろいろ調べているのですが、標準装備の WebBrowser のサンプルはあるのですが、
AxWebBrowser のサンプルがなく先が見えない状態です。
AxWebBrowser で GetElementsByTagName を使用する方法をご存知の方が
いらっしゃいましたら、アドバイス頂けたら幸いです。
C# のコードでは (型)オブジェクト という形でキャストしていたと思います。
VB では DirectCast や CType を使います。
Hongliangさん、レスありがとうございました。
検索語句のハイライトON/OFFの件については、
何とか自己解決できましたので報告いたします。
Private Sub btnSearchWord_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearchWord.Click
Static Dim blnHighlight As Boolean = True
Dim key As String = txtSearchWord.Text
If key = vbNullString Then Exit Sub
Dim className As String = "keyword: " & key
Dim spanStart As String = "<SPAN class=" & Chr(34) & className & Chr(34) & " style=" & Chr(34) & "background-color: #FFFF63" & Chr(34) & ">"
Dim spanEnd As String = "</SPAN>"
If blnHighlight Then
'検索語句ハイライトON
Dim doc As mshtml.IHTMLDocument2 = DirectCast(AxWebBrowser.Document, mshtml.IHTMLDocument2)
Dim body As mshtml.IHTMLBodyElement = DirectCast(doc.body, mshtml.IHTMLBodyElement)
Dim range As mshtml.IHTMLTxtRange = DirectCast(body.createTextRange(), mshtml.IHTMLTxtRange)
Dim blnFoundFirst As Boolean = True
Dim BMK As String = vbNullString
While (range.findText(key, 1, 0))
range.pasteHTML(spanStart & range.htmlText & spanEnd)
If blnFoundFirst Then
'最初に見つかった位置を保存しておきます。
If Len(BMK) = 0 Then BMK = range.getBookmark
range.moveToBookmark(BMK)
range.scrollIntoView()
blnFoundFirst = False
End If
End While
doc = Nothing
body = Nothing
range = Nothing
Else
'検索語句ハイライトOFF
Dim doc As mshtml.IHTMLDocument3 = DirectCast(AxWebBrowser.Document, mshtml.IHTMLDocument3)
Dim docelems As mshtml.IHTMLElementCollection = doc.getElementsByTagName("SPAN")
For Each HtmlElement As mshtml.IHTMLElement In docelems
If (HtmlElement.getAttribute("className").Equals(className)) Then HtmlElement.outerHTML = HtmlElement.innerHTML
Next
doc = Nothing
docelems = Nothing
End If
blnHighlight = Not blnHighlight
End Sub