【良回答には1,000ポイント送信します】


VB.NT(VisualBasic2008Express)のSubを書いてください。本当に困っています。同かよろしくお願い申し上げます。

ByVal wbToTry As System.Windows.Forms.WebBrowser,
ByVal strUrl As String,
ByVal intWaitTimeBySecForCompleted As Integer,
ByVal intWaitCountOfCompleted As Integer,
ByRef intCountOfCompleted As Integer,
ByRef strNormalFinishOrErrorFinish

を受け取り、次のような挙動をする。

(1) wbToTry で、strUrl に格納されたURLを表示しようと試み、
(2) intWaitTimeBySecForCompleted に格納された数値の秒数だけ DocumentComleted イベントが発生するのを待つ。
(3) もし intWaitTimeBySecForCompleted の時間内に、wbToTry で DocumentCompleted イベントが発生したら、intCountOfCompleted に 1 を足すとともに、intWaitCountOfComplete から 1 を引く。
(4) もし、intWaitCountOfComplete が 0 に達していなかったら、(2)に戻り、もし達していたら、strNormalFinishOrErrorFinish に "Normal" を代入して、Subを出る。
(5) intWaitTimeBySecForCompleted の時間内に、wbToTry で DocumentCompleted イベントが発生しなくなったら、strNormalFinishOrErrorFinish に "Normal" を代入して、Subを出る。
(&) 上記の最中、もし、エラーが発生したら、strNormalFinishOrErrorFinish に "Error" を代入して、Subを出る。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/02/08 16:30:36
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:code_tk No.1

回答回数77ベストアンサー獲得回数11

ポイント60pt

以下のページの

http://www.atmarkit.co.jp/fdotnet/dotnettips/687nondispbrowser/n...

NonDispBrowserという部分にカウント処理を入れれば大体望みの処理になりませんかね?

望みの仕様をかなえようとするとDocumentCompletedにイベントハンドラを追加したうえでグローバル変数でカウントアップってやり方しかできないような気がするので

id:jjkkjpvb2008

スミマセンが、具体的なコードをお願いしています。

2010/02/06 12:35:41
  • id:Mook
    サンプルを書こうとしてみましたが、フォームの中身とやりたいことが分かりません。

    URLとWebBrowser コンポーネントはそれぞれ一つですから、一回の処理の中で
    DocumentComleted が発生するのは一回のはずですが、それを
    intWaitCountOfComplete や intCountOfCompleted でカウントしたり、複数回の処理を
    待つようなループにするのはなぜでしょうか。

    また、通常 DocumentComleted はイベントとして発生するので、関数の中でこれを待つような
    処理はしません。これをイベント処理にしないのはなぜでしょうか。

    これらの説明があると、より適切なサンプル提示ができると思います。
  • id:jjkkjpvb2008
    DocumentCompleteは一つのURLを表示するにあたって複数発生しますよ。

    また、表示されるパターンが複数つあり、DocumentCompleteが発生した回数によって表示内容がちがうためです。
  • id:Mook
    なるほど、URL内で複数の参照をしている場合は DocumentComplete が複数発生しますが、いずれにせよ
    それはイベントとして発生するものだと思いますが、それをイベント処理にしないのはどのような理由
    からでしょうか。

    また、フォームの構成要素と、実際のイベント発生例などは例示できないでしょうか。

    全体を WebBrowser のイベント処理で構成したほうが素直だと思うのですが。
  • id:jjkkjpvb2008
    「イベント処理にする」というのがよくわからないのです。…

    > また、フォームの構成要素と、実際のイベント発生例などは例示できないでしょうか。

    はい、できます。例えば、Nikkei NET で株式の銘柄のコードをURL指定して表示使用すると、そのコードの銘柄が存在する場合は1回だけ、存在しない場合は2回(逆だったかな?)、DocumentComplete イベントが発生します。
    そのコードの株式が存在するケース: http://company.nikkei.co.jp/index.aspx?scode=5401
    そのコードの株式が存在しないケース: http://company.nikkei.co.jp/index.aspx?scode=5400

    > 全体を WebBrowser のイベント処理で構成したほうが素直だと思うのですが。

    すみません、不勉強で、「全体を WebBrowser のイベント処理で」構成する、ということの意味がわかりません…
  • id:Mook
    たとえば、wbToTry という名の WebBrowser コンポーネントを使用した場合、ここで Navigate をすれば
    DocumentComplete が 発生した時に、wbToTry_DocumentCompleted というプロシージャが呼び出されます。
    ここに処理を記述しておけば、いちいちステータスを監視しながらループ処理をしなくとも、イベントを
    キャッチして処理を行うことができます。

    「フォームの構成要素を例示できますか」と書いたのは、それがわかればサンプルを書く時に
    各イベント処理をかけるからです。

    例えば、フォーム内に URL を記述する TextBox1と、実行を解する Button1、表示する wbToTry(WebBrowser)
    があるとわかれば、回答の仕方もそれに沿ったものになります。
  • id:jjkkjpvb2008
    自分で書いたのは下記のコードですが、これだと、最初のDodumentCompleteイベントが発生してから以後、1/1000sec.ごとにDocumentCompleteをカウントアップしてしまうのです。

    'ShowInWbAndCountComplete

    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 _
    )
    intCountOfComplete = 0
    WbName.Navigate(strUrl)
    For i As Integer = 1 To intWaitCountOfComplete
    For j As Integer = 1 To (intWaitTimeBySecForComplete * 60)
    If WbName.ReadyState = WebBrowserReadyState.Complete Then
    intCountOfComplete = intCountOfComplete + 1
    End If
    Application.DoEvents()
    System.Threading.Thread.Sleep(1)
    Next
    Next

    End Sub
  • id:jjkkjpvb2008
    >Mookさん

    新しく質問を立て直しましたので、そちらでご回答いただけませんか。
    よろしくお願い申し上げます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません