いつも参考にさせていただきありがとうございます。
vbsでコーディングをしております。
フォームボタン(input type=button)を押下後にFor文で繰り返し処理をおこないます。
For iCnt=0 to 100
Document.Forms(0).Elements("ボタン名").disabled=True
〜処理〜
Msgbox "処理がおわりました"
Document.Forms(0).Elements("ボタン名").disabled=False
Next
For文に入ってすぐにボタンをdisabledして、抜ける直前で復帰させたいのですが、目に見える挙動は、「処理がおわりました」が表示されたときに押下不可になります。
こういう場合、disabledをTrueにしたときにsleepでタイムラグを設けてやるとか、なにかひと工夫必要なのでしょうか。
(わざわざsllepさせるのはいかにも無駄…ですよね)
よろしくお願いします。
>For iCnt=0 to 100
の前に
Doeventsを入れてみては?
関数内の処理は1つの処理として扱われ、終わるまで
画面の描画処理は行われません。
>sleepでタイムラグ
何も処理しない時間が作られるだけなので、描画処理も
走らず、何の効果も無いと思います。
>>For iCnt=0 to 100
>の前に
>Doeventsを入れてみては?
安易に DoEvents を入れるとOSが保留にしていた処理が
実行され、Disabled で無効にする意図と反する動きを
するかもしれません。
そもそもループの前では意味が無いかもしれません。
一般には再描画したいオブジェクトの Refresh メソッドを
呼び出します。
あう、vbsの話でしたか失礼しました。
VBでは再現出来ませんでした。
特攻隊長まるるうさん
>そもそもループの前では意味が無いかもしれません。
ループの中に入れるのが問題で
状態の変更なら外の方が良いのではないでしょうか?
>一般には再描画したいオブジェクトの Refresh メソッドを
>呼び出します。
こちらが正解だと思います。勉強になります。
> ループの中に入れるのが問題で
> 状態の変更なら外の方が良いのではないでしょうか?
質問文のプログラムコード自体、あまり良くないと思うんだけどね。
ループ内で変更してるので、100回目に見える挙動を起こしたいのかと
解釈したわけです。
ループ外に出した方がいいというアドバイスなら、DoEvents だけで
なくて、
> Document.Forms(0).Elements("ボタン名").disabled=True
も DoEvents の前に出さないと挙動は変わらないのでは?
なるほど。
解決しそうですね。
ツイート | ![]() |