tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: VB WebBrowserでページの切り替えが思うように出来ない
投稿日: 2015/08/14(Fri) 19:18
投稿者魔界の仮面弁士
> 下記コードのようにループでページを切り替える方法がうまく
> いきません。
アプリケーションがアイドル状態に入らないと、
WebBrowser がページを処理できないためです。

今回の件に限った話ではありませんが、
コントロールのイベント(Button1_Click など)には、
時間のかかる処理を書かないようにしましょう。



> なぜかNavigateの後にMsgBoxを入れるとその時点でページが変わり
> HTMLを取得出来ます(MessageBox.Showでも可能)。
メッセージボックスの表示中は、
 「他に処理が行われておらず、ユーザーからの操作を待っている状態」
にあたります。このため、アプリケーションがアイドル状態になったことで、
WebBrowser の処理を実行できる余裕が生まれたわけです。


> 順次タイマーイベントを発生させて
タイマー利用時は、どのように処理させましたか?


> コードが煩雑のため単純ループのような簡単な方法に変更したいです。
Timer の場合、タイマー通知は非同期的に行われますよね。
Start メソッドで呼びだした後、最初の Tick イベント発生までには、Interval 以上の時間を要します。

WebBrowser の場合も同様に、処理が非同期的に行われます。
Navigate メソッド呼びだし後、DocumentCompleted イベント発生までにはある程度の時間を要します。


使用しているオブジェクトが違うだけで、処理の流れとしては同じことです。



Public Class Form1
    Private urlList As New List(Of String)()
    Private urlIndex As Integer = -1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        urlList.Add("http://www.google.co.jp/")
        urlList.Add("http://www.microsoft.co.jp/")
        urlList.Add("http://www.apple.co.jp/")
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Button1.Enabled = False

        urlIndex = 0
        Dim url As String = urlList(urlIndex)
        WebBrowser1.Navigate(url)
    End Sub

    Private Sub WebBrowser1_DocumentCompleted(sender As Object, _
            e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted

        Debug.WriteLine("===============" & e.Url.ToString())
        Debug.WriteLine(WebBrowser1.DocumentText)

        urlIndex += 1
        If urlIndex < urlList.Count Then
            Dim url As String = urlList(urlIndex)
            WebBrowser1.Navigate(url)
        Else
            urlIndex = -1
            Button1.Enabled = True
        End If
    End Sub
End Class

たとえば上記では、Button1_Click で Navigate した後、
直ちに End Sub に到達しているため、その時点でアイドル状態に入ります。
これならば、DocumentCompleted のイベントが発生すると思いますよ。





上記の Enumerator 版。
Enumerator は「For Each〜Next」時に内部で利用されているものですが、
管理としてはこちらの方が楽かもしれません。


Public Class Form1
    Private urlList As New List(Of String)()
    Private nextUrl As List(Of String).Enumerator

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        urlList.Add("http://www.google.co.jp/")
        urlList.Add("http://www.microsoft.co.jp/")
        urlList.Add("http://www.apple.co.jp/")
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Button1.Enabled = False

        nextUrl = urlList.GetEnumerator()
        WebBrowser1.Navigate(nextUrl.Current)
    End Sub

    Private Sub WebBrowser1_DocumentCompleted(sender As Object, _
            e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted

        Debug.WriteLine("===============" & e.Url.ToString())
        Debug.WriteLine(WebBrowser1.DocumentText)

        If nextUrl.MoveNext() Then
            WebBrowser1.Navigate(nextUrl.Current)
        Else
            Button1.Enabled = True
        End If
    End Sub
End Class

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。