VB初心者です。
ループの中で変化する値を数秒おきにループの途中で
休みを入れて結果の画面上に数秒間隔で数値を更新して
出力したいと考えております。
そこで,タイマを使うやり方と,InputBoxを使う方法を
試してみましたが,いずれもすべての処理が終わった後で
一番最後のデータだけがループ上で所望の時間Xループ回数
分の時間後に表示されるか,InputBoxの場合はループ回数
だけメッセージボックスに入力してこちらも最後の結果だけ
が最後に出力されるだけになってしまいます。
Timerの場合は
Do While Timer XXX>Timer
DoEvents
Loop
としてスリープ状態にはならないようにしておりますが
うまく途中の結果を出してくれる出力画面を出すことが
できません。
何かうまい方法はないでしょうか?
よろしくお願いいたします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
私の記憶があいまいなので
意図される動きとなるか微妙ですが
タイマーの実行間隔を例えば1秒(1000ミリ秒)としたら
タイマーのプロパティで1秒を設定。
表示させたい値をグローバルな変数なりにコピーして
タイマー側ではその値を読んで表示。
例えばこんな感じ。
'***タイマー実行開始
Do While ***ループ条件***
DoEvents
'***値の受け渡し
Loop
「ループで休みを入れて」ということなので、
ループの途中でいったん停止みたいなのが必要なら
タイマーでループの休止フラグのオンオフ制御して
こな感じ。
'***タイマー実行開始
Do While ***ループ条件***
DoEvents
if(休止フラグがONなら)
値表示
Do While 休止フラグがOFFになるまで
DoEvents
Loop
end if
Loop
ひとまず処理のイメージ版です。
どうもありがとうございました。
結局ループが回っていてもとまっていて欲しいので
その時間分(例えば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画面を表示をしていて欲しいのですが,
なぜかそれはできないことなんでしょうか?
データを何秒おきかに見に行く際にもやはり、全部読んで
から表示ということはないと思いますので、何らかの
手法があるのではと思いまして。そちらの方法でもかまい
ませんので何かよい例がありましたら教えてください。
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
No.3
- 回答日時:
#1です。
なんとなくムフフンな感じなのでちょっと踏み込んで調べてみました。
http://msdn.microsoft.com/ja-jp/library/system.w …
ここのサンプルリストを元にいじくってみます。
まずは、とりあえず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
さて、このドナーさんはうまいこと移植先に適合してくれるでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java Java 南京錠 2 2023/02/04 11:46
- Java Java モンスターブリーダー 1 2023/02/05 09:44
- Windows 10 windows10のクリーンインストールが完了出来ない 2 2022/06/04 13:33
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- Microsoft ASP プログラミング関係で質問です。 3 2022/10/11 16:06
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
- CPU・メモリ・マザーボード 昨日SSDを増設したら、PCが点かなくなりました。 ※BIOS画面にも行けません。 OSの入ったスト 6 2022/08/15 10:53
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- Java Javaの問題なのですが、 永久ループを使って以下に従って数値を出力するプログラムを作成する。 ・1 3 2023/06/06 18:43
- Visual Basic(VBA) エクセルのマクロで対象ごとにシート分けしてその内容をセルに書き込みたい 9 2022/08/24 13:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミングについて。 1つ...
-
どなたかこのプログラミングを...
-
ネットワークループとルーティ...
-
VBAでの一時停止と再開の方法
-
画面を強制的に再描画させる方法
-
イベントの発生を待つ
-
UWSCの終了の仕方
-
多重ループの抜けだし方
-
【VBA】指定の範囲から特定の文...
-
VBA横データを縦にしたいです
-
DOSコマンドのループ内のTIMEコ...
-
vb.netからエクセル関数書き込み
-
ループフリー
-
これの名称なんて~の?ダッフ...
-
VLC media Playerでのループ再生
-
スレッド起動したフォームを正...
-
CASL2のアセンブリ(?)で質問...
-
テキストボックスの名前に変数...
-
範囲指定したセルを1つずつ飛...
-
VisualStudioにてモザイクの画...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
どなたかこのプログラミングを...
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
エクセルの当番表を作っていま...
-
VBA for i=1 to lastrow
-
「偶数・奇数の和」のフローチ...
-
アクティブセルから、A列最終行...
-
DoEventsが必要な理由について
-
vb.netからエクセル関数書き込み
-
GIFアニメをループさせたくない
-
DOSコマンドのループ内のTIMEコ...
-
範囲指定したセルを1つずつ飛...
-
流れ図(フローチャート)が分か...
-
乱数の桁数指定、または範囲指定。
-
テキストボックスの名前に変数...
-
CSVファイルの特定の行だけを読...
-
vb.netです。2次元配列の要素を...
おすすめ情報