• 締切済み

VB ループ中の値をゆっくり出力

VB初心者です。 ループの中で変化する値を数秒おきにループの途中で 休みを入れて結果の画面上に数秒間隔で数値を更新して 出力したいと考えております。 そこで,タイマを使うやり方と,InputBoxを使う方法を 試してみましたが,いずれもすべての処理が終わった後で 一番最後のデータだけがループ上で所望の時間Xループ回数 分の時間後に表示されるか,InputBoxの場合はループ回数 だけメッセージボックスに入力してこちらも最後の結果だけ が最後に出力されるだけになってしまいます。 Timerの場合は  Do While Timer XXX>Timer DoEvents Loop としてスリープ状態にはならないようにしておりますが うまく途中の結果を出してくれる出力画面を出すことが できません。 何かうまい方法はないでしょうか? よろしくお願いいたします。

みんなの回答

  • hisappy
  • ベストアンサー率46% (184/392)
回答No.3

#1です。なんとなくムフフンな感じなので ちょっと踏み込んで調べてみました。 http://msdn.microsoft.com/ja-jp/library/system.windows.forms.timer.aspx ここのサンプルリストを元にいじくってみます。 まずは、とりあえず3秒毎に一時停止版からです。 Public Class Class1 Private Shared myTimer As New System.Windows.Forms.Timer() Private Shared alarmCounter As Integer = 1 Private Shared exitFlag As Boolean = False ' This is the method to run when the timer is raised. Private Shared Sub TimerEventProcessor(myObject As Object, myEventArgs As EventArgs) myTimer.Stop() ' Displays a message box asking whether to continue running the timer. 'ここのMsgBoxに表示させたい内容を設定する。 If MessageBox.Show("ここねココ、ココ。", _ MessageBoxButtons.YesNo) = DialogResult.Yes Then ' Restarts the timer and increments the counter. alarmCounter += 1 myTimer.Enabled = True Else ' Stops the timer. exitFlag = True End If End Sub Public Shared Sub Main() ' Adds the event and the event handler for the method that will ' process the timer event to the timer. AddHandler myTimer.Tick, AddressOf TimerEventProcessor ' Sets the timer interval to 3 seconds. myTimer.Interval = 3000 myTimer.Start() ' んで、ここがループさせたい処理の部分。 While exitFlag = False ' 実際に処理されるループの内側です。 Application.DoEvents() End While End Sub End Class メッセージボックスで停止しているので、 YES押さないと処理は続行されません。 NO押すと終了してしまいます。 そこで、いよいよ期待されている動きっぽい版です。 なお、動作テストしてないうえに そもそもコーディングの作りが質問者さんのものに適合しているかも判りませんので あくまでも「期待されている動きをするっぽい版」です。 ちなみに、3秒動いて1秒休止の決め付け仕様なので 流用される際は都合よく調整して下さい。 Public Class Class1 Private Shared myTimer1 As New System.Windows.Forms.Timer1() '3秒動くよ用 Private Shared myTimer2 As New System.Windows.Forms.Timer2() '1秒止まるよ用 Private Shared alarmCounter As Integer = 1 'これ要らなくなくなってない?? Private Shared exitFlag As Boolean = False 'こっちまで要らなくなくなってない?? 'こっちは3秒動くよ側のタイマー Private Shared Sub TimerEventProcessor1(myObject As Object, myEventArgs As EventArgs) 'そいじゃ途中経過表示しますべか。 text1.text = "Aaaa" '1秒止まる動作(?)稼動開始。 myTimer2.Enabled = True '停止解除されるの待ちまーす。 myTimer1.Stop() End Sub 'こちらは1秒とまるよ側のタイマー Private Shared Sub TimerEventProcessor2(myObject As Object, myEventArgs As EventArgs) myTimer2.Stop() '動くよ側の停止を解除してお役御免。 myTimer1.Enabled = True End Sub Public Shared Sub Main() ' Adds the event and the event handler for the method that will ' process the timer event to the timer. AddHandler myTimer1.Tick, AddressOf TimerEventProcessor1 AddHandler myTimer2.Tick, AddressOf TimerEventProcessor2 ' Sets the timer1 interval to 3 seconds. myTimer1.Interval = 3000 ' Sets the timer2 interval to 1 seconds. myTimer2.Interval = 1000 '動くよ側動作開始。 myTimer1.Start() '・・・正しくはどうやるのだろう。。。 myTimer2.Start() myTimer2.Stop() ' んで、ここがループさせたい処理の部分。 'ループの条件は調整してくださいね。 While exitFlag = False ' 実際に処理されるループの内側です。 Application.DoEvents() End While End Sub End Class さて、このドナーさんはうまいこと移植先に適合してくれるでしょうか?

すると、全ての回答が全文表示されます。
  • hotosys
  • ベストアンサー率67% (97/143)
回答No.2

質問の内容と違ってるかもしれませんが、 「ループ中に変化する変数の値を一定期間毎にその時点での値を表示する」 と言う事ならです。 どのVB(VB6?)かわからないのですが、こんなのではどうでしょうか? Sub sample() Dim n As Long Dim t As Single '以下のDo~Loopがループ処理 Do 'ループ内の処理 n = n + 1 '表示処理 DoEvents '適当な位置に必要 If Timer >= t Then '表示時刻? t = Timer + 3 '次の表示時刻を設定(この場合3秒後) '表示処理 Label1 = n End If Loop End Sub

すると、全ての回答が全文表示されます。
  • hisappy
  • ベストアンサー率46% (184/392)
回答No.1

私の記憶があいまいなので 意図される動きとなるか微妙ですが タイマーの実行間隔を例えば1秒(1000ミリ秒)としたら タイマーのプロパティで1秒を設定。 表示させたい値をグローバルな変数なりにコピーして タイマー側ではその値を読んで表示。 例えばこんな感じ。 '***タイマー実行開始 Do While ***ループ条件*** DoEvents '***値の受け渡し Loop 「ループで休みを入れて」ということなので、 ループの途中でいったん停止みたいなのが必要なら タイマーでループの休止フラグのオンオフ制御して こな感じ。 '***タイマー実行開始 Do While ***ループ条件*** DoEvents if(休止フラグがONなら)  値表示  Do While 休止フラグがOFFになるまで   DoEvents  Loop end if Loop ひとまず処理のイメージ版です。

HomeWorker
質問者

お礼

どうもありがとうございました。 結局ループが回っていてもとまっていて欲しいので その時間分(例えば3秒)だけとまっていて欲しいと いうことで、以下の様にしてみましたが、結果は同じ でした(すべての操作が終わるまでコマンド画面でした)。 Do While Timer+3 > Timer DoEvents if Timer+3 > Timer  text1.text = "Aaaa"  Do While Timer+3 > Timer   DoEvents  Loop end if Loop 基本的には何秒間かループの中で止まっていて くれればよいのですが。 スリープみたいなのでもかまいませんが、その間も しっかりForm画面を表示をしていて欲しいのですが, なぜかそれはできないことなんでしょうか? データを何秒おきかに見に行く際にもやはり、全部読んで から表示ということはないと思いますので、何らかの 手法があるのではと思いまして。そちらの方法でもかまい ませんので何かよい例がありましたら教えてください。

すると、全ての回答が全文表示されます。

関連するQ&A