VB.NT(VisualBasic2008Express)のSubを書いてください。本当に困っています。同かよろしくお願い申し上げます。
ByVal wb1 As System.Windows.Forms.WebBrowser,
ByVal strUrl As String,
ByVal intWaitSecCompleted As Integer,
ByVal intWaitCountCompleted As Integer,
ByRef intCountCompleted As Integer,
を受け取り、次のような挙動をする。
(1) wb1で、strUrlのURLを表示しようと試み、
(2) intWaitSecCompletedの秒数だけDocumentComletedイベントが発生するのを待つ。
(3) もしintWaitSecCompletedの秒数内にDocumentCompletedイベントが発生したら、intCountCompletedに1を足すとともに、intWaitCountOfCompleteから1を引く。
(4) もし、intWaitCountOfCompleteが0に達していなかったら(2)に戻り、達していたらSubを出る。
(5) intWaitSecCompletedの時間内にDocumentCompletedイベントが発生しなくなったらSubを出る。
だいぶお急ぎだったようですね。
質問で提示された内容と厳密に同じではないですが、こちらで機能的には同じになるよう解釈をして実装例です。
新規プロジェクトで「Winidows フォーム アプリケーション」を選択し、そこに Button(Button1) と
TextBox(TextBox1)と WbeBrowser(WebBrowser1)を配置しただけのものに、下記コードを置けば
動作環境は完了です。
TextBox1に URL を入力してボタン(Button1)をクリックすれば、WebBrowser1 に結果が表示されます。
厳密に、求められるものとは異なると思いますが、まずはたたき台として見てみてください。
これをカスタマイズしていくことで目的のものができそうならば、コメントに修正したい内容を書いていただければ、
できる範囲で対応いたします。
Public Class Form1 '//------------------------------------------------------------- '// DocumentCompleted 用カウンタ '//------------------------------------------------------------- Public intCountOfComplete As Integer '//------------------------------------------------------------- '// DocumentCompleted イベント処理 '//------------------------------------------------------------- Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted intCountOfComplete = intCountOfComplete + 1 End Sub '//------------------------------------------------------------- '// クリックするとブラウズを開始 '//------------------------------------------------------------- Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Dim intWaitTimeBySecForComplete As Integer = 2 Dim intWaitCountOfComplete As Integer = 2 Dim result As String = "" ShowInWbAndCountComplete(WebBrowser1, TextBox1.Text, intWaitTimeBySecForComplete, intWaitCountOfComplete, result) MsgBox(result) End Sub 'ShowInWbAndCountComplete '//------------------------------------------------------------- '// ブラウジング処理 '//------------------------------------------------------------- Private Sub ShowInWbAndCountComplete _ (ByRef WbName As System.Windows.Forms.WebBrowser, _ ByRef strUrl As String, _ ByRef intWaitTimeBySecForComplete As Integer, _ ByRef intWaitCountOfComplete As Integer, _ ByRef strNormalFinishOrErrorFinish As String) '// カウンタを初期化 intCountOfComplete = 0 WbName.Navigate(strUrl) Dim startTime As DateTime startTime = TimeOfDay() strNormalFinishOrErrorFinish = "Normal" Do While WbName.ReadyState <> WebBrowserReadyState.Complete For j As Integer = 1 To (intWaitTimeBySecForComplete * 60) '// Complete カウントチェック If intCountOfComplete >= intWaitCountOfComplete Then strNormalFinishOrErrorFinish = "All Completed" Exit Do End If '// タイムアウトチェック If DateDiff("s", startTime, TimeOfDay()) >= intWaitTimeBySecForComplete Then strNormalFinishOrErrorFinish = "Time Out" Exit Do End If '// Application.DoEvents() System.Threading.Thread.Sleep(100) '// 100msec : 0.1 sec sleep Next Loop End Sub End Class
具体的なコードをとのことなので書いてみました
強引に仕様に従ってますので正直微妙です
どのような挙動が正しいのかが分からないのであってるか自信がありません
すいませんが具体的に何がしたいかを明記してもらったほうがいいかもしれません
※日系のページから株価を取得したいとか
ちなみに終了処理とかエラー処理とか全然書いていませんしバグ取りもしていないので使用には注意してください
Imports System Imports System.ComponentModel Imports System.Windows.Forms Public Class Form1 Dim _intWaitCountOfCompleted As Integer Dim _intCountOfCompleted As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim x As String = "" ShowInWbAndCountComplete(WebBrowser1, "http://company.nikkei.co.jp/index.aspx?scode=5401", 20, 10, 0, x) End Sub Private Sub ShowInWbAndCountComplete( _ ByRef WbName As System.Windows.Forms.WebBrowser, _ ByRef strUrl As String, _ ByRef intWaitTimeBySecForComplete As Integer, _ ByRef intWaitCountOfComplete As Integer, _ ByRef intCountOfComplete As Integer, _ ByRef strNormalFinishOrErrorFinish As String) intCountOfComplete = 0 _intCountOfCompleted = intCountOfComplete _intWaitCountOfCompleted = intWaitCountOfComplete AddHandler WbName.DocumentCompleted, AddressOf DocumentCompleted WbName.Navigate(strUrl) Dim start As DateTime = DateTime.Now Dim timeout As New TimeSpan(0, 0, intWaitTimeBySecForComplete) While intWaitCountOfComplete > 0 intWaitCountOfComplete = _intWaitCountOfCompleted If DateTime.Now - start > timeout Then intCountOfComplete = _intCountOfCompleted intWaitCountOfComplete = _intWaitCountOfCompleted strNormalFinishOrErrorFinish = "Error" Exit Sub End If Application.DoEvents() End While intCountOfComplete = _intCountOfCompleted intWaitCountOfComplete = _intWaitCountOfCompleted strNormalFinishOrErrorFinish = "Normal" Exit Sub End Sub Private Sub DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) _intCountOfCompleted = _intCountOfCompleted + 1 _intWaitCountOfCompleted = _intWaitCountOfCompleted - 1 End Sub End Class
> ※日系のページから株価を取得したいとか
ビンゴ!
頭に「_」がついた変数は何ですかね? 「同じもの」ということですか?
株式情報サイトによっては、その銘柄が存在するページと存在しないページとでDocumentCompletedイベントの発生回数が違うので、それを利用して、銘柄コードを収集しようとしてます。
また、株式関連情報ページにも、完全に全ての情報が表示されるまで何度もDocumentCompletedを待たないといけないページもありますので、それにも使うつもりです。
1つのSubにまとまればいいんだけどなぁ…。
だいぶお急ぎだったようですね。
質問で提示された内容と厳密に同じではないですが、こちらで機能的には同じになるよう解釈をして実装例です。
新規プロジェクトで「Winidows フォーム アプリケーション」を選択し、そこに Button(Button1) と
TextBox(TextBox1)と WbeBrowser(WebBrowser1)を配置しただけのものに、下記コードを置けば
動作環境は完了です。
TextBox1に URL を入力してボタン(Button1)をクリックすれば、WebBrowser1 に結果が表示されます。
厳密に、求められるものとは異なると思いますが、まずはたたき台として見てみてください。
これをカスタマイズしていくことで目的のものができそうならば、コメントに修正したい内容を書いていただければ、
できる範囲で対応いたします。
Public Class Form1 '//------------------------------------------------------------- '// DocumentCompleted 用カウンタ '//------------------------------------------------------------- Public intCountOfComplete As Integer '//------------------------------------------------------------- '// DocumentCompleted イベント処理 '//------------------------------------------------------------- Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted intCountOfComplete = intCountOfComplete + 1 End Sub '//------------------------------------------------------------- '// クリックするとブラウズを開始 '//------------------------------------------------------------- Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Dim intWaitTimeBySecForComplete As Integer = 2 Dim intWaitCountOfComplete As Integer = 2 Dim result As String = "" ShowInWbAndCountComplete(WebBrowser1, TextBox1.Text, intWaitTimeBySecForComplete, intWaitCountOfComplete, result) MsgBox(result) End Sub 'ShowInWbAndCountComplete '//------------------------------------------------------------- '// ブラウジング処理 '//------------------------------------------------------------- Private Sub ShowInWbAndCountComplete _ (ByRef WbName As System.Windows.Forms.WebBrowser, _ ByRef strUrl As String, _ ByRef intWaitTimeBySecForComplete As Integer, _ ByRef intWaitCountOfComplete As Integer, _ ByRef strNormalFinishOrErrorFinish As String) '// カウンタを初期化 intCountOfComplete = 0 WbName.Navigate(strUrl) Dim startTime As DateTime startTime = TimeOfDay() strNormalFinishOrErrorFinish = "Normal" Do While WbName.ReadyState <> WebBrowserReadyState.Complete For j As Integer = 1 To (intWaitTimeBySecForComplete * 60) '// Complete カウントチェック If intCountOfComplete >= intWaitCountOfComplete Then strNormalFinishOrErrorFinish = "All Completed" Exit Do End If '// タイムアウトチェック If DateDiff("s", startTime, TimeOfDay()) >= intWaitTimeBySecForComplete Then strNormalFinishOrErrorFinish = "Time Out" Exit Do End If '// Application.DoEvents() System.Threading.Thread.Sleep(100) '// 100msec : 0.1 sec sleep Next Loop End Sub End Class
ありがとうございます。
株式情報サイトによっては、その銘柄が存在するページと存在しないページとでDocumentCompletedイベントの発生回数が違うので、それを利用して、銘柄コードを収集しようとしてます。
また、株式関連情報ページにも、完全に全ての情報が表示されるまで何度もDocumentCompletedを待たないといけないページもありますので、それにも使うつもりです。
1つのSubにまとまればいいんだけどなぁ…。
ただいま検証中ですので、お待ちください…
DocumentCompletedはイベントですので読み込みが完了した段階でイベントに書いた処理が発生します。
私の処理もAddHandlerでイベント設定してますしMookさんのもそうですよね
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.web...
んでReadyStateはプロパティです。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.web...
どちらで処理する場合も各フレームなどの単位で実行・設定されてしまうので正確に取得するならどのフレームで実行されたかを取得する必要があります
今回の場合はDocumentCompletedイベントが複数回呼び出されるのはAdSense関係が呼び出されるためのようですが…
こういうVBでHTTPアクセス関係好きなので日経にアクセスするソースも書いてみました
あとはHTMLソースを加工すれば株価取得とかできそうですね
例によって適当なのでエラー処理などは随時追加をお願いします
Public Class Form1 Dim done As Boolean Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim URL(3) As String URL(0) = "http://company.nikkei.co.jp/index.aspx?scode=7203" URL(1) = "http://company.nikkei.co.jp/index.aspx?scode=8411" URL(2) = "http://company.nikkei.co.jp/index.aspx?scode=8306" For x As Integer = 0 To 2 If NavigateAndWait(WebBrowser1, URL(x)) Then MsgBox(WebBrowser1.DocumentTitle) Else MsgBox("Error") End If Next End Sub Public Function NavigateAndWait(ByRef WbName As System.Windows.Forms.WebBrowser, ByVal url As String) As Boolean ' タイムアウト時間(60秒) Dim timeout As New TimeSpan(0, 0, 60) Dim start As DateTime = DateTime.Now done = False WbName.Navigate(url) ' ページの移動 While done = False If DateTime.Now - start > timeout Then ' タイムアウト Return False End If Application.DoEvents() End While Return True End Function Private Sub DocumentCompleted(ByVal sender As System.Object, _ ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs _ ) Handles WebBrowser1.DocumentCompleted 'e.urlが読み込みが終了したURL:sender.urlがアクセスしたいURL Console.WriteLine(e.Url) If e.Url = sender.Url Then done = True End If End Sub End Class
他の方とやり方が割と違いますがこんな感じではダメでしょうか。
Public Class Form4
Private intCountCompleted As Integer = 0 '他のメソッドでも使用するのでフィールドにしました
Private blnTimeOut As Boolean = False '読み込みがタイムアウトした時にはTrueに設定する
Private intWaitCountOfComplete As Integer = 0
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim _intWaitSecCompleted As Integer = 3 'ダミーとして3秒としました
Dim _intWaitCountOfComplete As Integer = 3 'ダミーで3回としました
Me.ShowSite(Me.WebBrowser1, Me.TextBox1.Text, _intWaitSecCompleted, _intWaitCountOfComplete, Me.intCountCompleted)
End Sub
'指定されたメソッドです
Private Sub ShowSite(ByRef wb1 As WebBrowser, ByVal strUrl As String, ByVal intWaitSecCompleted As Integer, ByRef intWaitCountOfComplete As Integer, ByRef intCountCompleted As Integer)
Me.blnTimeOut = False
Me.Timer1.Interval = intWaitSecCompleted * 1000 'ミリ秒に変換
Me.intWaitCountOfComplete = intWaitCountOfComplete
Me.Timer1.Enabled = True
wb1.Url = New Uri(strUrl)
End Sub
Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'ウェブブラウザが完了した時の呼び出されるメソッドを登録
AddHandler Me.WebBrowser1.DocumentCompleted, New WebBrowserDocumentCompletedEventHandler(AddressOf wbDocumentCompleted)
End Sub
Private Sub wbDocumentCompleted(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs)
If Me.blnTimeOut = False Then
'タイマーがタイムアウトを告げる前に読み込みが完了した場合
Me.intCountCompleted += 1
Me.intWaitCountOfComplete -= 1
If Me.intWaitCountOfComplete = 0 Then
Me.Timer1.Stop()
Me.Timer1.Enabled = False
MessageBox.Show("読み込み完了!")
End If
End If
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
'読み込みを中止する
Me.WebBrowser1.Stop()
'タイムアウトのフラグを設定
Me.blnTimeOut = True
Me.Timer1.Enabled = False
MessageBox.Show("タイムアウトのため中断しました。" + " " + Me.intWaitCountOfComplete.ToString())
End Sub
End Class
ありがとうございます。
株式情報サイトによっては、その銘柄が存在するページと存在しないページとでDocumentCompletedイベントの発生回数が違うので、それを利用して、銘柄コードを収集しようとしてます。
また、株式関連情報ページにも、完全に全ての情報が表示されるまで何度もDocumentCompletedを待たないといけないページもありますので、それにも使うつもりです。
1つのSubにまとまればいいんだけどなぁ…。
ただいま検証中ですので、お待ちください…