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

WebBrowserコントロールのDocumentCompletedイベントについて

環境/言語:[XP、VB]
分類:[.NET]

初めまして、ぶーと言います。

私はVB6はかなり使い込んでいましたが、VB.net、VB2005は勉強を始めた
ばかりで、おかしな質問をしてしまうかも知れませんがご容赦ください。

では、本題です。
私は、VB2005のWebBrowserコントロールを使用して、Web巡回プログラムを
作成しようとしています。

Navigateメソッド発行後、エレメントを参照すると「オブジェクト参照が
オブジェクト インスタンスに設定されていません。」とのエラーが
発生しますが、Navigateメソッドが非同期なため、読込み完了前にエレメントを
参照してしまうためだと考えています。

これは、DocumentCompletedイベント内でエレメントを参照すると正しい
結果が帰ってくるので間違いないと思います。

しかし、DocumentCompletedイベント内にコーディングしたのでは
部品化できないため、Navigateメソッドとエレメントの参照を繰り返す
Web巡回プログラムとして使うことはできません。

何か、よい方法はないでしょうか?
クラス継承を使えばうまくいくとか、何か手がかりをご教授いただきたく、
お願いします。
例えば,次のようにすれば同期して処理することができますが...
DoEventsのループのところで何が起きるか予測がつかないので
ちょっと怖いコードです。
最低でもタイムアウトの処理は必要だと思います。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.WebBrowser1.GoHome()
While Me.WebBrowser1.ReadyState <> WebBrowserReadyState.Complete
Application.DoEvents()
End While
Dim Elements As HtmlElementCollection = Me.WebBrowser1.Document.GetElementsByTagName("a")
For Each Element As HtmlElement In Elements
Debug.Print(Element.OuterHtml)
Next
End Sub
> しかし、DocumentCompletedイベント内にコーディングしたのでは
コーディングというのは処理部分ですよね?
Delegateを使うとか、もしくはURLに対応する専用の処理クラスを保持しておいて、
DocumentCompleteが発行されたらその処理を実行するようにすればイイのではないでしょうか?
(Adapter?…うーん)
YASさん、ガッさん、レスありがとうございます。

YASさんのソースは、私なりに解析してからご返事をしたいと思いますので
しばらくお待ちください。
(私には難しいソースなのでヘルプを参照しながら格闘してみます)

ガッさんのご意見は、Delegateが分からないので調べてみます。
ただ、汎用のプログラムを目指しているので、URL単位のクラスは
作りたくないのです。例えば、「画像リンクを探す」とか「URLを移動する」
などを部品化したいと考えています。わがまま言ってすみません。

みなさん、貴重なご意見をありがとうございました。
YASさんのソースで問題なさそうです。

もし問題が発生したら別スレッドで、またご教授いただくかも
しれませんが・・・。

大変助かりました。ありがとうございました。
解決済み!

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