人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【良回答には1万pt(!)送信します】

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を出る。

●質問者: jjkkjpvb2008
●カテゴリ:コンピュータ インターネット
✍キーワード:as NT PT String sub
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● code_tk
●100ポイント

具体的なコードをとのことなので書いてみました

強引に仕様に従ってますので正直微妙です

どのような挙動が正しいのかが分からないのであってるか自信がありません

すいませんが具体的に何がしたいかを明記してもらったほうがいいかもしれません

※日系のページから株価を取得したいとか

ちなみに終了処理とかエラー処理とか全然書いていませんしバグ取りもしていないので使用には注意してください

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にまとまればいいんだけどなぁ…。


2 ● Mook
●100ポイント ベストアンサー

だいぶお急ぎだったようですね。


質問で提示された内容と厳密に同じではないですが、こちらで機能的には同じになるよう解釈をして実装例です。

新規プロジェクトで「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にまとまればいいんだけどなぁ…。

ただいま検証中ですので、お待ちください…


3 ● code_tk
●100ポイント

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


4 ● freemann
●100ポイント

他の方とやり方が割と違いますがこんな感じではダメでしょうか。


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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ