ボタンdisabled時の時間差


ネンペーム  2009-08-28 21:07:10  No: 101950

いつも参考にさせていただきありがとうございます。

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させるのはいかにも無駄…ですよね)

よろしくお願いします。


もに  2009-08-29 03:45:04  No: 101951

>For iCnt=0 to 100
の前に
Doeventsを入れてみては?


特攻隊長まるるう  2009-08-29 20:47:47  No: 101952

関数内の処理は1つの処理として扱われ、終わるまで
画面の描画処理は行われません。
>sleepでタイムラグ
何も処理しない時間が作られるだけなので、描画処理も
走らず、何の効果も無いと思います。

>>For iCnt=0 to 100
>の前に
>Doeventsを入れてみては?
安易に DoEvents を入れるとOSが保留にしていた処理が
実行され、Disabled で無効にする意図と反する動きを
するかもしれません。
そもそもループの前では意味が無いかもしれません。

一般には再描画したいオブジェクトの Refresh メソッドを
呼び出します。


もに  2009-08-29 22:39:38  No: 101953

あう、vbsの話でしたか失礼しました。
VBでは再現出来ませんでした。

特攻隊長まるるうさん
>そもそもループの前では意味が無いかもしれません。
ループの中に入れるのが問題で
状態の変更なら外の方が良いのではないでしょうか?

>一般には再描画したいオブジェクトの Refresh メソッドを
>呼び出します。
こちらが正解だと思います。勉強になります。


特攻隊長まるるう  2009-08-31 00:10:31  No: 101954

> ループの中に入れるのが問題で
> 状態の変更なら外の方が良いのではないでしょうか?
質問文のプログラムコード自体、あまり良くないと思うんだけどね。
ループ内で変更してるので、100回目に見える挙動を起こしたいのかと
解釈したわけです。

ループ外に出した方がいいというアドバイスなら、DoEvents だけで
なくて、
>  Document.Forms(0).Elements("ボタン名").disabled=True
も DoEvents の前に出さないと挙動は変わらないのでは?


もに  2009-08-31 04:21:06  No: 101955

なるほど。
解決しそうですね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加