DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Webbrowserのタブ(TabPages)の情報について

環境/言語:[XP sp3/VB2005]
分類:[.NET]

2011/08/01(Mon) 23:03:43 編集(投稿者)
2011/08/01(Mon) 23:01:26 編集(投稿者)
2011/08/01(Mon) 23:00:21 編集(投稿者)

現在、Webbrowserを TabControlを使用するようにしています。


TabControlのTabPages1にHPを表示させ、target="_blank"のリンクをクリックしたらTabPages2に表示させるようにしています。


ここまではいいのですが、

TabControl1.TabPages.Remove(TabControl1.SelectedTab)

でTabPages2を削除した後、

WebBrowser.Document.Title.ToString()

を取得すると、削除したTabPages2のDocument.Titleが表示されてしまいます。



TabPages1は、まだ残っているので、TabPages1のDocument.Titleを取得したいのですが、どうしたらよいでしょうか?



方法として、TabPages2の削除前に、

TabControl11.SelectedIndex = 0 

として、TabPages1を選択しても変わりませんでした。



TabPages2の情報を完全に削除するか、前の情報を消すためWebBrowser.Documentの再読込をしたいのです。



こちらのプログラムの過程の事情で、target="_blank"のリンクをクリックの前にTabPages1のWebBrowser.Documentの取得したり、WebBrowser自体のの再読込などはしたくありません。




他に方法ありますでしょうか?




タブの実装については、YASさんのサンプルコードを使わせて頂いています。

VB2005のWebBrowserコントロールにNewWindow2イベントを拡張する
http://homepage1.nifty.com/yasunari/VB/VB2005/WebBrowserNewWindow2Event.htm
■No28827に返信(ザナドゥさんの記事)
> TabPages2を削除した後、
> WebBrowser.Document.Title.ToString()
> を取得すると、削除したTabPages2のDocument.Titleが表示されてしまいます。

それは、NewWindow2 イベントで TabPage1 に対応する ExWebBrowser を捨てて、新しい TabPage2 に対応する ExWebBrowser を代入しているからでは?
TabPage1 に対応する ExWebBrowser が必要なら同じ変数に代入する(上書きする)のではなく、別の変数に代入するなどの対応が必要でしょう。

配列とか、リストとか、Tab プロパティを利用するとか、いくつか案は考えられます。
ザナドゥさん,私のつたないページを見ていただきありがとうございます。

Azuleanさんのおっしゃる通りで解決すると思います。

具体的には,

Me.TabPage1.Tag = WebBrowser1

のようにTabPageのTagプロパティにでもWebBrowserコントロールをメモしておき,

DirectCast(Me.TabControl1.SelectedTab.Tag, ExWebBrowser).Document.Title

のようにすれば現在選択されているタブのWebBrowserのTitleが取得できると思います。
Azuleanさん、いつも返信有り難うございます。
大変助かっております。

YASさん、VisualBasicサンプルプログラム、勉強させていただいています。
具体的なコード有り難いです。
特にWebBrowserコントロール関連は、よく利用させていただいています。


お二方の助言のおかげで問題は解決しました。
Document.Titleは問題なく表示できました。



しかし、1ヶ所だけ解決出来ない部分が出てきてしまいました。


今まで問題なくクリック出来ていたのですが、無反応になってしまいます。

WebBrowser1.Document.All.Item(GetIndex("ok")).InvokeMember("click")

↓(変更)

DirectCast(Me.TabControl11.SelectedTab.Tag, ExWebBrowser).Document.All.Item(GetIndex("ok")).InvokeMember("click")

無反応



これはInvokeMemberメソッドを利用出来ていないということでしょうか?
> DirectCast(Me.TabControl11.SelectedTab.Tag, ExWebBrowser).Document.All.Item(GetIndex("ok")).InvokeMember("click")

GetIndex("ok")が何を返しているか確かめてみてください。
おそらくこの関数が正しいHtmlDocumentを見ていないのではないでしょうか。
■No28832に返信(YASさんの記事)
>>DirectCast(Me.TabControl11.SelectedTab.Tag, ExWebBrowser).Document.All.Item(GetIndex("ok")).InvokeMember("click")
>
> GetIndex("ok")が何を返しているか確かめてみてください。
> おそらくこの関数が正しいHtmlDocumentを見ていないのではないでしょうか。


YASさん、有り難うございます。
おっしゃる通りでした。
こちらの単純ミスでした。

おかげさまで解決いたしました。

有り難うございます。
解決済み!
2011/08/05(Fri) 03:03:19 編集(投稿者)

このWebbrowserコーポネントを初期化する方法はありますでしょうか?


DirectCast(Me.TabControl1.SelectedTab.Tag, ExWebBrowser).Navigate("http://yahoo.com")

無反応


TabPage2削除した後、TabPage1でのNavigateが出来なくなっているのですが、何が原因でしょうか?


初期化すれば最初の状態に戻るので問題解決だと思ったのですが、about:blankではダメでした。
「動かないのはなぜでしょうか?」と問いたくなるのはわかりますが、何をどのように変えたか、正確なところがわからないので、答えようがないのが実情です。

サンプルコードからどの部分をどのように変えたか、具体的に言明してください。
そういった努力をすることは最低限必要ではないでしょうか?
(安易な質問はだめです)
■No28838に返信(Azuleanさんの記事)
> 「動かないのはなぜでしょうか?」と問いたくなるのはわかりますが、何をどのように変えたか、正確なところがわからないので、答えようがないのが実情です。
>
> サンプルコードからどの部分をどのように変えたか、具体的に言明してください。
> そういった努力をすることは最低限必要ではないでしょうか?
> (安易な質問はだめです)


失礼いたしました。

YASさんのサンプルコードに助言頂いたとおり

Me.TabPage1.Tag = WebBrowser1
をTabPageのTagプロパティに追加し

webbrowser1を
DirectCast(Me.TabControl1.SelectedTab.Tag, ExWebBrowser)
に変更しました。


前回のDocument.Titleは解決したのですが、再度TabPage1でwebbrowser1でNavigateを実行(タイマーイベントにより繰り返し実行)すると無反応になってしまいます。


どうかアドバイス、よろしくお願いします。
■No28839に返信(ザナドゥさんの記事)

この、

DirectCast(Me.TabControl1.SelectedTab.Tag, ExWebBrowser)

は、期待するwebbrowser1を指していますか?
あるいは、Me.TabControl1.SelectedTabは、webbrowser1のタブになっていますか?

> YAS様
もしかして、YAS様はブログのアクセスログのrefererを見て、掲示板に書き込みを
されているのでしょうか?
そうであるならば、大変頭が下がります。
実は、私の知り合いが、あるブログに記載されている技術について、別の掲示板で質問したところ、
ブログ主の方からすぐにコメントを頂いたとのことでしたが、それも確かWebBrowserを継承したものだったような。
もしかしてこれもYAS様?
タラオさん

> もしかして、YAS様はブログのアクセスログのrefererを見て、掲示板に書き込みを
> されているのでしょうか?

うっ。そこまでできた人間じゃないです。
いつも見ている掲示板がいくつかあって,その中で自分に解決できそうな質問を見つけては,サンプルプログラムを作ってみて楽しんでいるだけなんです...

ただ,WebBrowserにだけは,ちょっとだけですがこだわりがあります。
私,小学校の教員なんですが,子ども用のブラウザ(漢字にふりがなをふったり,見たままを印刷したり,履歴にキャプチャ画面のアイコンをつけたり,履歴を保存できたりなど)を作って教室で使っていたことがあるんです。
そのときにWebBrowser関係のことをたくさん掲示板で質問し,みなさんに教えていただいたので,そのご恩を少しでも返せればと思い,WebBrowserに関する質問を見つけると,分かる範囲ですができるだけ回答するようにしています。

ザナドゥさん

>前回のDocument.Titleは解決したのですが、再度TabPage1でwebbrowser1でNavigateを実行(タイマーイベントにより繰り返し実行)すると無反応になってしまいます。
そのタイマーイベントの処理がどうなっているか,もう少し具体的に教えていただけますか?
また,無反応になるというのはフリーズするという意味でしょうか,それともメソッドを無視し,何も起きないという意味でしょうか。
タラオさん、YASさん、返信ありがとうございます。


いろいろと試した結果、エラーになる箇所が特定できました。


タイマーイベントで30分後に以下の処理を繰り返すようにしています。
(長いコードなのでエラーの箇所だけ表示しています)

一度目は問題なく処理できているのですが、2度目の処理で、以下のgifボタンをクリックが出来ていませんでした。
(もしくは、クリックは出来ているが、新しいTabPageが立ち上がらないためか?)


For Each HtmlElement As HtmlElement In DirectCast(Me.TabControl1.SelectedTab.Tag, ExWebBrowser).Document.All
If HtmlElement.GetAttribute("src") = "http://hogehoge.com/icon_button.gif" Then
HtmlElement.InvokeMember("click")
Exit For
End If
Next



'リロード完了待ち
With DirectCast(Me.TabControl1.SelectedTab.Tag, ExWebBrowser)

Do Until .ReadyState = WebBrowserReadyState.Complete
Application.DoEvents()
Loop
End With

'タブなのでリロード待ちは要らないかもしれません。


Dim all5 As HtmlElementCollection = DirectCast(Me.TabControl1.SelectedTab.Tag, ExWebBrowser).Document.All
Dim forms As HtmlElementCollection = all5.GetElementsByName("keyword")
forms(0).InnerText = "VB2005" ' テキストボックスに「VB2005」を入


前の処理で、"keyword"のあるHP(http://hogehoge.com/icon_button.gifでクリック)に切り替わっていないので、ここでエラーが出ます。



一応、テストとして、2度目のときにに以下のコードでナビゲートしてみたら、問題なく表示してくれたので、WebBrowserじたいは問題ないように思われます。

DirectCast(Me.TabControl1.SelectedTab.Tag, ExWebBrowser).Navigate("http://www.cocoaliz.com/vb.net/index/10/")



クリックは出来ているが、新しいTabPageが立ち上がらないという可能性のほうが高いでしょうか?
>以下のgifボタンをクリックが出来ていませんでした。
>(もしくは、クリックは出来ているが、新しいTabPageが立ち上がらないためか?)

どちらか絞り込めませんか?

If HtmlElement.GetAttribute("src")= "http://hogehoge.com/icon_button.gif" Then
    Debug.Print("ボタン見つけた")
    HtmlElement.InvokeMember("click")
    Exit For
End If

などとすればボタンを見つけることができたのかそうでないのか分かると思います。

>'リロード完了待ち
この処理はできればやめた方がいいです。
永久ループの可能性もありますし,DoEventの間に何が起こるかわかりません。
DocumentComletedイベントに記述すべきだと思います。
毎回イベントの処理が実行されると困る場合にはフラグとIF Thenで場合分けを
したり,AddHandler,RemoveHandlerで必要な時だけ呼び出されるようにしたり
したらよいと思います。

申し訳ありませんが,プログラムの目的というか,何がしたいのか今ひとつよくわかりません。
検索の自動化や,巡回の自動化がしたいのでしょうか?
■No28846に返信(YASさんの記事)

> どちらか絞り込めませんか?
>
> If HtmlElement.GetAttribute("src")= "http://hogehoge.com/icon_button.gif" Then
> Debug.Print("ボタン見つけた")
> HtmlElement.InvokeMember("click")
> Exit For
> End If
>
> などとすればボタンを見つけることができたのかそうでないのか分かると思います。


YASさん、返信ありがとうございます。

上記のコードを試してみたところ、"ボタン見つけた"と出ましたので、問題なく処理できているということだと思います。


ということは、タイマーイベントで2回目にコードを実行したときに、新しいTabPageが立ち上がらないということが原因でしょうか。



内容としましては、TabPage1でgifボタン(icon_button.gif)を押すと、新しいTabPageが立ち上がり、その新しいTabPageの中にあるgifボタンを押すと、新しいTabPageの中のTextboxの内容が、TabPage1のテキストボックスに貼り付けるという内容になります。
(Textboxの内容は時間によって変わってきます。)

それをタイマーイベントで30分後とに実行しています。


最後に新しいTabPageを以下の方法で削除しているのですが、これが問題の可能性がありますでしょうか?

'2つ目のタブを削除する
TabControl1.TabPages.Remove(TabControl1.SelectedTab)





> この処理はできればやめた方がいいです。
> 永久ループの可能性もありますし,DoEventの間に何が起こるかわかりません。
> DocumentComletedイベントに記述すべきだと思います。
> 毎回イベントの処理が実行されると困る場合にはフラグとIF Thenで場合分けを
> したり,AddHandler,RemoveHandlerで必要な時だけ呼び出されるようにしたり
> したらよいと思います。

アドバイス有難うございます。

早速変更コードを作り試してみたいと思います。
2011/08/06(Sat) 04:28:48 編集(投稿者)
2011/08/06(Sat) 04:26:41 編集(投稿者)

-追記-

先ほど、target="_blankの場合は、2回目でもちゃんと新しいTabPageが表示されることが確認出来ました。

とすると、

> If HtmlElement.GetAttribute("src")= "http://hogehoge.com/icon_button.gif" Then
> Debug.Print("ボタン見つけた")
> HtmlElement.InvokeMember("click")
> Exit For
> End If

の場合だけ、2回目の時に、クリックは出来ているのだがTabPageが表示されないということになります。

ちなみにソースは画像ファイルとして添付させて頂きたいと思います。
(リンクタグが貼れない為)




target="_blankだと2回目でも新しくTabPageが表示され、icon_button.gifだと新しいTabPageが表示されない。


ますます分からなくなってきました・・・
添付ファイル: sousu.png (7 KB)
TabPageを削除する際にTabPageの上に乗っているWebBrowserとTabPageをDisposeしてみたらどうでしょうか。

Dim SelectedTab as TabPage = TabControl1.SelectedTab
SelectedTab.Controls.Remove(SelectedTab.Tag)
SelectedTab.Tag.Dispose
TabControl1.TabPages.Remove(SelectedTab)
SelectedTab.Dispose()

簡単なタブブラウザを作ったことがあります。よろしければ参考にしてください。
http://homepage1.nifty.com/yasunari/VB/VB2005/BasicTabBrowser.htm
■No28850に返信(YASさんの記事)
> TabPageを削除する際にTabPageの上に乗っているWebBrowserとTabPageをDisposeしてみたらどうでしょうか。
>
> Dim SelectedTab as TabPage = TabControl1.SelectedTab
> SelectedTab.Controls.Remove(SelectedTab.Tag)
> SelectedTab.Tag.Dispose
> TabControl1.TabPages.Remove(SelectedTab)
> SelectedTab.Dispose()



YASさん、有難うございます。
上記のコードで上手くいきました。
やはり前の情報がまだ残ってしまっていたのが原因でしょうか。


>
> 簡単なタブブラウザを作ったことがあります。よろしければ参考にしてください。
> http://homepage1.nifty.com/yasunari/VB/VB2005/BasicTabBrowser.htm

こちらは、すでに参考にさせて頂いています。
というか、使わせていただいています。

有難うございます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板