« telnetのオートパイロット | トップページ | 書誌:レガシーコード改善ガイド »

2014.03.22

VB系で割り込み処理:DoEvents

少し前に1d20(20面サイコロを1回振る)様のランダム関数について紹介したが、その際に今回初めて知ったステートメントについてメモリ。

結果が一発で出てしまうのではなく、サイコロが転がってどの目が出るのかはらはらするような演出をしようと思ったので、結果を出す前にランダムで途中経過を表示するようにしてみた。
このときにFOR文でこの焦らすループを作成したのだが、テキストボックスに途中経過がどうしても表示されなかった。

For i = 1 To 5
 dieValue.Text = " "
 ret = getVal1d20()
 dieValue.Text = ret & "?"
 j = i * i * 50
 Call Sleep(j)
Next

ret = getVal1d20()
dieValue.Text = ret & "!"
こんな感じで5回ほど別の値をランダムで取得して、表示を行なうのである。
ソースを見ただけだと特に問題はない。
ちゃんとループされるたびにretの値は変更されていることもデバッグで確認できた。
しかし、dieValueテキストボックスには初期値からいきなり、最後の結果だけ出力されてしまった。

これは基本的に、ひとつのプロシージャは始まったら終わりまで頑張り続けるため、VBA内では変更があるのだが、それをフロント側であるExcelなりPowerPointなりに反映することができていないのだ。
そこで登場するのが"DoEvents"。
この関数はOS側にコントロールを渡す、という処理になる。
本来は長いループの中でキー割り込み処理を行なったりするのに使用されるのだが、今回はご承知のとおり、サイコロが転がってる感じを出すために、Officeアプリのテキストボックスを再描画するのに使用した。

For i = 1 To 5
 dieValue.Text = " "
 ret = getVal1d20()
 dieValue.Text = ret & "?"
 DoEvents
 j = i * i * 50
 Call Sleep(j)
Next

ret = getVal1d20()
dieValue.Text = ret & "!"
こんな感じである。
サイコロがだんだん止まっていく感じを出すために、sleep時間は一定ではなく、ループカウンタが進むごとに「ため」の時間が長くなるように調整してある。

|

« telnetのオートパイロット | トップページ | 書誌:レガシーコード改善ガイド »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2022/59324972

この記事へのトラックバック一覧です: VB系で割り込み処理:DoEvents:

« telnetのオートパイロット | トップページ | 書誌:レガシーコード改善ガイド »