VB6SP5 WinXpで開発しています。
ボタンを連打するとその回数分処理が行われるのですが
それを最初の1回だけにしたいのです。
Command1.Visible = False
Me.Enabled = False
Debug.Print Me.Enabled
Do
i = i + 1
If i = 10000000 Then
Exit Do
End If
Loop
Me.Enabled = True
Command1.Visible = True
上記の様に書いてみても一回処理が終わってから押したぶんだけ繰り返されます。
どこかに何回押したかが溜まっている様に思うのですが
これが溜まらない様にとかできるのでしょうか?
どうかご教示願います。
ボタンだけが対象なら、Me.Enabled ではなく、Command1.Enabled で良いような。
> 上記の様に書いてみても一回処理が終わってから押したぶんだけ繰り返されます。
Enabled を True に戻す直前に、DoEvents 関数を呼び出しましょう。
> 最初の1回だけにしたいのです。
ならばCommand1のEnabledを一度Falseにしたら二度と戻さないとか。
> どこかに何回押したかが溜まっている様に思うのですが
> これが溜まらない様にとかできるのでしょうか?
メッセージキューに溜めさせないようにする方法はわかりませんが、
DoEventsをEnabled=Trueの直前に挟むと解決できます。
Private Sub Command1_Click()
Dim d As Date
Debug.Print "Command1_Click"
With Command1
.Enabled = False
'busy loop
d = Now
Do While DateDiff("s", d, Now) <= 1: Loop
DoEvents
.Enabled = True
End With
End Sub
返信ありがとうごさいます。
魔界の仮面弁士さん、ガッさん解決できました。
ついでにですがどうしてDoevents入れるんでしょうか?
DoEventsがどういった命令か分かりますか?
どうして繰り返しを行うときにDo-Loopを入れると思いますか?
DoEvents自体を良くわかっていないのです。
Windowsに制御を渡すとかなのかな?と思っているのですが・・・
繰り返しの時にDo-LOOPを入れるのはどうして?
繰り返したいからとかは答えにはならないんですよね・・・
すみません。わかりません。
横から失礼致します。
自分の解釈があってるかどうかはわかりませんが、
Clickイベントを.Enable=Falseで防いでるわけですから、
.Enable=Falseの間に発生させないとまずいわけです。
だから.Enable=Trueにする前(.Enable=Falseの状態で)に、
DoEventsで溜まったClickイベントを発生させて無効化しましょう。
ということではないでしょうか。せっかくFalseにしてても
TrueにしたあとにClickイベントが発生しては無意味ですしね |>_<
#DoLoopはLoopさせるから、DoEventsはEventを発生させるから、、
#でしょうか。私もなんと回答したらいいかわからない|^-^;
なるほど
>DoEventsで溜まったClickイベントを発生させて無効化しましょう
という事なのですね。
ありがとうございました。
ツイート | ![]() |