• ベストアンサー

ループで文字を表示させるには?

VBは全くの初心者なのに無謀にも測定器の制御プログラムを組もうとしています。極めて初歩的な問題で困っています。 ある条件(premt(n) = coop)が満たされるまでDo~LoopでLabelに繰り返し文字を表示させたい,というごく単純な(?)要求です。例えば, Do until premt(n) = coop Label1.Caption = str$(premt(n)) Loop です。しかし実行するとLabel1にはstr$(premt(n))は表示されずLabel1の部分全体が真っ白になります。Loopしている間はPCはハングアップした状態になりCtr+Alt+Delキーでしか止められなくなります。しかしこの間もDo~Loopはちゃんと動いていてpremt(n) = coopが満たされれば次のステップに移行します。 Do~Loop文で(またはそれ以外の方法でも)文字を繰り返し表示させるにはどうすればよいのでしょうか,よろしくご指導のほどお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.2

Do until premt(n) = coop Label1.Caption = str$(premt(n)) DoEvents Loop というように、DoEventsを入れて、表示の更新をしないとダメでしょう。 また、表示が速いと思いますので、 ウェイトを入れてあげないとダメでしょうね。

その他の回答 (2)

  • karon24
  • ベストアンサー率40% (8/20)
回答No.3

まずプログラムの先頭に下の関数定義を書いておいてください。 処理を一時的に停止させる関数を使うための呪文みたいなもんです。 Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) で、肝心の部分は '--------------------------------------------- 'premt(n)がcoopと一致するまでループ Do Until premt(n) = coop 'インデックスが配列の要素の最大値を超えたらループ終了 If n > Ubound(premt) then Exit Do End If 'ラベルに表示 Label1.Caption = str$(premt(n)) '画面を更新 DoEvents '処理を一時中断 (この例だと 100ミリ秒停止します) Sleep (100) '配列のインデックスをカウント n = n + 1 Loop '--------------------------------------------- こんな感じですかね。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.1

こんにちは。maruru01です。 premt(n)は配列ですよね。 ということは、nは配列のインデックスということになります。 このnに何が入っているのでしょうか。 仮に宣言した直後は、0(数値型でしょうから)が入っています。 そして、Do~Loop内でこのnの値を変更する命令がいっさいありません。 従って、このループ内では永遠にpremt(0)という同じ値を見ています。 そして、premt(0)=coopが満たされない場合は、永遠にループを続けてしまいます。 従って以下のようにすれば、ループから抜けられます。 Do Until premt(n) = coop   Label1.Caption = Str$(premt(n))   n = n + 1 Loop ただし、これもpremt配列が1つもcoopと一致しなければ、抜けられませんが。 また、このコードだと、premt配列内の値が次々にLabel1に表示されるため、結局一番最後(premt(n) = coopを満たす直前)の値を表示したようにしか見えませんよ。 Do~Loop内で一定時間待機するようにしないと途中の値は見えませんよ。