コマンドボタンを連打させない

解決


へなちょこ  2007-03-07 23:02:54  No: 98230

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

上記の様に書いてみても一回処理が終わってから押したぶんだけ繰り返されます。
どこかに何回押したかが溜まっている様に思うのですが
これが溜まらない様にとかできるのでしょうか?

どうかご教示願います。


魔界の仮面弁士  2007-03-07 23:42:56  No: 98231

ボタンだけが対象なら、Me.Enabled ではなく、Command1.Enabled で良いような。

> 上記の様に書いてみても一回処理が終わってから押したぶんだけ繰り返されます。
Enabled を True に戻す直前に、DoEvents 関数を呼び出しましょう。


ガッ  2007-03-07 23:48:22  No: 98232

> 最初の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


へなちょこ  2007-03-08 00:17:42  No: 98233

返信ありがとうごさいます。
魔界の仮面弁士さん、ガッさん解決できました。
ついでにですがどうしてDoevents入れるんでしょうか?


  2007-03-08 15:03:05  No: 98234

DoEventsがどういった命令か分かりますか?
どうして繰り返しを行うときにDo-Loopを入れると思いますか?


へなちょこ  2007-03-08 18:57:06  No: 98235

DoEvents自体を良くわかっていないのです。
Windowsに制御を渡すとかなのかな?と思っているのですが・・・

繰り返しの時にDo-LOOPを入れるのはどうして?
繰り返したいからとかは答えにはならないんですよね・・・

すみません。わかりません。


KG  2007-03-09 05:08:52  No: 98236

横から失礼致します。
自分の解釈があってるかどうかはわかりませんが、

Clickイベントを.Enable=Falseで防いでるわけですから、
.Enable=Falseの間に発生させないとまずいわけです。
だから.Enable=Trueにする前(.Enable=Falseの状態で)に、
DoEventsで溜まったClickイベントを発生させて無効化しましょう。
ということではないでしょうか。せっかくFalseにしてても
TrueにしたあとにClickイベントが発生しては無意味ですしね |>_<

#DoLoopはLoopさせるから、DoEventsはEventを発生させるから、、
#でしょうか。私もなんと回答したらいいかわからない|^-^;


へなちょこ  2007-03-09 18:28:56  No: 98237

なるほど
>DoEventsで溜まったClickイベントを発生させて無効化しましょう
という事なのですね。
ありがとうございました。


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

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






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