VB系で割り込み処理:DoEvents
少し前に1d20(20面サイコロを1回振る)様のランダム関数について紹介したが、その際に今回初めて知ったステートメントについてメモリ。
結果が一発で出てしまうのではなく、サイコロが転がってどの目が出るのかはらはらするような演出をしようと思ったので、結果を出す前にランダムで途中経過を表示するようにしてみた。
このときにFOR文でこの焦らすループを作成したのだが、テキストボックスに途中経過がどうしても表示されなかった。
For i = 1 To 5こんな感じで5回ほど別の値をランダムで取得して、表示を行なうのである。
dieValue.Text = " "
ret = getVal1d20()
dieValue.Text = ret & "?"
j = i * i * 50
Call Sleep(j)
Next
ret = getVal1d20()
dieValue.Text = ret & "!"
ソースを見ただけだと特に問題はない。
ちゃんとループされるたびに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時間は一定ではなく、ループカウンタが進むごとに「ため」の時間が長くなるように調整してある。
| 固定リンク
コメント