こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

CheckBoxのMouseDown

こんにちは

1)
Private Sub Check1_Click(Index As Integer)
Debug.Print "Index : " & Index & _
", Check1(Index).Value : " & Check1(Index).Value & _
", Check1(0).Value : " & Check1(0).Value
End Sub

Private Sub Check1_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
  Debug.Print "Check1_MouseDown"
  Select Case Index
    Case 0
      If Check1(0).Value = 0 Then
        Check1(0).Value = 1
      Else
        Check1(0).Value = 0
      End If
      Check1(1).Value = 0
    Case 1
      Check1(0).Value = 0
      If Check1(1).Value = 0 Then
        Check1(1).Value = 1
      Else
        Check1(1).Value = 0
      End If
  End Select
End Sub

(VB6, WinXPHome)
というプログラムを実行したところ、下のような結果になりました。

Check1_MouseDown
Index : 0, Check1(Index).Value : 1, Check1(0).Value : 1
Index : 0, Check1(Index).Value : 0, Check1(0).Value : 0

2)
Check1_MouseDownでMsgBoxを出すとCheck1_Clickイベントが発生しなくなります。

どうしてこういう結果になってしまうのか?
どこが悪いのか?
最終的に1)2)合わせた形でCheck1(0).Value = 1にするにはどうすればいいのかを教えてください、お願いします。

投稿日時 - 2003-06-10 11:19:12

QNo.571044

困ってます

質問者が選んだベストアンサー

排他処理を入れなきゃあたりまえ。
MouseDownで値を操作するのは、よくない。

チェックボックスでオプションボタンの動きがしたいわけ?
もしそうなら、こんな感じ。
Private Sub Check1_Click(Index As Integer)
  Dim intIndex1  As Integer
  Dim intIndex2  As Integer
  
  Static bln処理フラグ  As Boolean
  
  If bln処理フラグ Then
    Exit Sub
  End If
  bln処理フラグ = True
  
  intIndex1 = Index
  intIndex2 = Abs(Index - 1)
  
  Check1(intIndex2).Value = Abs(Check1(intIndex1).Value - 1)
  
  bln処理フラグ = False
End Sub


メッセージボックス出したら、以降の一連のVBに送られるメッセージは破棄されるので当然。
イベントがどのように起こるものかを理解することが必要。
KeyAsciiとKeyDowmイベントの関係でも、同様なことが起こる。

投稿日時 - 2003-06-10 12:28:29

お礼

>メッセージボックス出したら、以降の一連のVBに送られるメッセージは破棄される
そういうことですか、ありがとうございます。

投稿日時 - 2003-06-10 19:41:13

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

こんにちは。
試してみたら、こんな結果になりました。

Check1_MouseDown
Index : 0, Check1(Index).Value : 1, Check1(0).Value : 1
Index : 0, Check1(Index).Value : 0, Check1(0).Value : 0
Check1_MouseDown
Index : 1, Check1(Index).Value : 1, Check1(0).Value : 0
Index : 1, Check1(Index).Value : 0, Check1(0).Value : 0

どこが悪いかというと、check1 の value をいじっているところです。

  Select Case Index
    Case 0
      Check1(1).Value = 0
    Case 1
      Check1(0).Value = 0
  End Select

これでいい結果になるのではないですか?

2) ですが、よくわかりません。

投稿日時 - 2003-06-10 11:40:17

ANo.1

多分 イベントの発生順序を考慮しないといけないでしょうね。

投稿日時 - 2003-06-10 11:28:21

あなたにオススメの質問