MouseClick判定-反応が早い方法はありませんか?

タグの編集
投稿者 ゆう  (学生) 投稿日時 2010/2/23 09:42:06
MouseClickの右クリックと左クリックを使ってラベルの数値を変えたいのですが、(左:増加、右:減少)どうも反応が鈍いです…。
なにかいい方法があったら教えてください。(VB2008Express)
とりあえず、書いてみたコードです。
    Public Sub SYUSSEKI(ByVal sender As ObjectByVal e As System.Windows.Forms.MouseEventArgs)
        Dim Jyu As String = sender.Text  '数値を表示しているラベルです。 
        Dim Kazu As Integer = CInt(Jyu) 'ラベルを数値化してみました。 
        If Kazu > 0 And Kazu < 31 Then
            Select Case e.Button
                Case Windows.Forms.MouseButtons.Left
                    '日数ラベルの左クリック対応(足す) 
                    sender.text = CStr(Kazu + 1)
                Case Windows.Forms.MouseButtons.Right
                    '日数ラベルの右クリック対応(引く) 
                    sender.text = CStr(Kazu - 1)
            End Select
        ElseIf Kazu = 31 Then
            Select Case e.Button
                Case Windows.Forms.MouseButtons.Left
                    '日数ラベルの左クリック対応(足せない) 
                    MsgBox("Error!" & vbNewLine & "これ以上の値を設定できません。")
                Case Windows.Forms.MouseButtons.Right
                    '日数ラベルの右クリック対応(引く) 
                    sender.text = CStr(Kazu - 1)
            End Select
        ElseIf Kazu = 0 Then
            Select Case e.Button
                Case Windows.Forms.MouseButtons.Left
                    '日数ラベルの左クリック対応(足す) 
                    sender.text = CStr(Kazu + 1)
                Case Windows.Forms.MouseButtons.Right
                    '日数ラベルの右クリック対応(引けない) 
                    MsgBox("Error!" & vbNewLine & "これ以下の値を設定できません。")
            End Select
        Else
            MsgBox("Error!" & vbNewLine & "値が異常です。")
        End If
    End Sub


Public Sub SYUSSEKI2(ByVal sender As ObjectByVal e As System.Windows.Forms.MouseEventArgs)
    Dim Jyu As String = sender.Text
    Select e.Button
        Case Windows.Forms.MouseButtons.Left
            '日数ラベルの左クリック対応(足す) 
            If Jyu = "31" Then
                MsgBox("Error!" & vbNewLine & "これ以上の値を設定できません。")
            Else
                Dim S As Integer
                For S = 0 To 30
                    If sender.text = CStr(S) Then
                        sender.text = CStr(S + 1)
                        Exit For
                    End If
                Next
            End If
        Case Windows.Forms.MouseButtons.Right
            '日数ラベルの右クリック対応(引く) 
            If Jyu = "0" Then
                MsgBox("Error!" & vbNewLine & "これ以下の値を設定できません。")
            Else
                Dim S As Integer
                For S = 1 To 31
                    If sender.text = CStr(S) Then
                        sender.text = CStr(S - 1)
                        Exit For
                    End If
                Next
            End If
    End Select
End Sub


Public Sub SYUSSEKI3(ByVal sender As ObjectByVal e As System.Windows.Forms.MouseEventArgs)
    Dim Jyu As String = sender.Text
    Select Case e.Button
        Case Windows.Forms.MouseButtons.Left
            '日数ラベルの左クリック対応(足す) 
            If Jyu = "31" Then
                MsgBox("Error!" & vbNewLine & "これ以上の値を設定できません。")
            ElseIf Jyu = "30" Then
                sender.text = "31"
            ElseIf Jyu = "29" Then
                sender.text = "30"
~~省略~~
            ElseIf Jyu = "0" Then
                sender.text = "1"
            Else
                MsgBox("Error!" & vbNewLine & "値が異常です。")
            End If
        Case Windows.Forms.MouseButtons.Right
            '日数ラベルの右クリック対応(引く) 
            If Jyu = "0" Then
                MsgBox("Error!" & vbNewLine & "これ以下の値を設定できません。")
            ElseIf Jyu = "31" Then
                sender.text = "30"
~~省略~~
            ElseIf Jyu = "1" Then
                sender.text = "0"
            Else
                MsgBox("Error!" & vbNewLine & "値が異常です。")
            End If
   End Select
End Sub


最後のやつが反応が良い気がしますが、それでも遅いです。
変なところがあったら、指摘・ヒント等いただけると嬉しいです。
よろしくお願いします。
投稿者 ヴァン  (社会人) 投稿日時 2010/2/23 18:53:40
何で反応が早い遅いを判断してます?
Stopwacthとか使って判断してます?

正直言えば、このコードの違いで早い遅いが判断できるなんて凄い能力だと思います。

単純にLabelのリフレッシュのタイミングの問題では?
投稿者 るしぇ  (社会人) 投稿日時 2010/2/23 19:35:07
マシンスペックが書かれていないけど、.Net が動く標準的なパソコンで書かれているコードの
実行時間を計ればほぼ0秒になると思います。

処理時間の計測には花ちゃんのサイトのサンプルコードを使用しました。
http://hanatyan.sakura.ne.jp/dotnet/day03.htm#no11
投稿者 デガンス  (社会人) 投稿日時 2010/2/23 21:18:57
MouseUpイベントに書いてるとか?
投稿者 ゆう  (学生) 投稿日時 2010/2/24 06:33:04
みなさんいろいろとありがとうございます。

Labelの再描画はMy.Application.DoEvents()でやってみましたが、2,3回ほどクリックしていると反応しなくなったりします…。


PCの性能は[Pen4 1.7GHz 512MB WinXP]です。


もう一度調べてみようかと思います。
投稿者 るしぇ  (社会人) 投稿日時 2010/2/24 06:49:15
> Labelの再描画はMy.Application.DoEvents()でやってみましたが
それは何の意味も無いような気がします。ってゆーか余計な処理?

もともと、描画はOS任せですが、ラベルの値が変わって、マウスの
イベントを抜ければ再描画されます。
命令の意味も分からず処理の途中で DoEvents するのはトラブルの元。
>2,3回ほどクリックしていると反応しなくなったりします…。
そういった余計なバグを生むだけでしょうね。
投稿者 るしぇ  (社会人) 投稿日時 2010/2/24 06:55:02
まぁ、あれです。コードの問題ではないでしょう。
マウスを連続してクリックしているのだと思いますが、
そもそも、マウスを連続してクリックすると、
ダブルクリックと認識されて、別の意味を持ちますから、
そもそものOSの仕様と合ってない仕様(実現したいこと)
だという事じゃないかと。
投稿者 るしぇ  (社会人) 投稿日時 2010/2/24 07:05:59
連投すいません。なんかもう、頭が疲れているのでダラダラしゃべってしまって。。。

・・・とはいえ、ダブルクリックイベントからも同じ関数を呼び出すようにすれば
いいだけなんですが、それで「早くなった」とか言い出すような内容じゃないかと
思ったわけです。
投稿者 ゆう  (学生) 投稿日時 2010/2/24 07:07:49
ふつうはやらないってことですね。
ありがとうございました。

ちなみに、ご指摘のダブルクリックイベントでも同じ処理を呼び出したらスムーズにいきました。
ダブルクリックになっていたんですね…すっきりしました。
自分のコードが間違っているのではないかといろいろ試してしまいました…。
勉強したいと思います…。