2011-08-13 4 views
2

ユーザーフォームで、私は表示を切り替えてフレームをオフ/オフしています。それは可変回数点滅してから停止しますが、点滅の間にユーザーの動作をチェックします。フォーム上の任意の場所、または含まれているコントロールのいずれかにマウスがクリックされた場合は、点滅が直ちに停止します。ループ内にコードを挿入してマウスをクリックした後でループを終了する

これは私のウインカーがどのように見えるかです。

For i = 1 To numberOfBlinks 
    <blink twice> 
    DoEvents 
    If <click detected> Then Exit Sub 
    Next i 

<click detected>部分を除いてすべて正常に動作します。どのようにループの内側からそれを行うのですか?

+0

これはあるものの視力検査のいずれかのように聞こえます特定の番号が表示された場合は、マウスをクリックするように求められます。p – aevanko

+0

これは良い質問です。 API関数がトリガーなどを設定している可能性があります。実際には、良い答えを楽しみにしています。ところで、最初の答えに対するあなたのコメントは、私の考えでは、問題をクリアするためにもあるかもしれません。 – Oneide

答えて

3

mouseclickイベントのグローバル変数をtrue(デフォルトはfalse)に変更しようとしましたか?

次に、グローバルブール変数が<click detected>に該当するかどうかを確認してください。

+0

マウスのクリックは何百ものコントロールのいずれかにある可能性があります。クリックを検出するためにクラスモジュールを使用する必要があると思いますが、簡単な方法はありますか?そうでない場合、誰かがそれを行うコードスニペットを提案できますか? – Roy

+0

Excel Userformには何百ものコントロールがありますか? – ChandlerPelhams

+0

はい、あります。大きなコンテナフレームはマップを保持し、100個の奇妙な子コントロールはマップ上のフィーチャーです。 – Roy

0

これはうまくいくようですが、マウスクリックを検出するだけのコードがたくさんあるようです。たとえば、すべてのフォームコントロールを含むクラスを作成することができるはずだと思ったので、それぞれのコントロールを別々にチェックする必要はありません。私はその仕事をすることができず、私は誰かがこれを改善することを望んでいます。

ユーザーフォームでは、mapFrameという名前の大きなフレームには他のフレームやラベルがいくつでも保持され、それらのフレームには他のフレームやラベルをいくつでも保持できますが、入れ子になります。私はループを開始したい(この場合、ループはコントロールの点滅を点滅させるが、それは他のループでも構わない)、ユーザが含まれているフレームやラベルのどれかをクリックしてループからの脱出を知らせるのを待つ。私はまた、クリックされたコントロールの名前を取得したい。

私はtherealmarvの提案を受け取り、ループ内でテストされるパブリックブール値を設定するためにクリックを使用しました。別の新しいクラスモジュールで

Option Explicit 

Public WithEvents classLabels As msForms.Label 

Private Sub classLabels_Click() 
    clickedControlName = "" '<== Public String 
    With classLabels 
    If .Parent.Name = "mapFrame" Or _ 
     .Parent.Parent.Name = "mapFrame" Then 
     isClickDetected = True '<== Public Boolean 
     clickedControlName = .Name 
    End If 
    End With 
End Sub 

:新しいクラスモジュールで

フォームモジュールで

Option Explicit 

Public WithEvents classFrames As msForms.Frame 

Private Sub classFrames_Click() 
    clickedControlName = "" '<== Public String 
    With classFrames 
    If .Name = "mapFrame" Or _ 
     .Parent.Name = "mapFrame" Or _ 
     .Parent.Parent.Name = "mapFrame" Then 
     isClickDetected = True '<== Public Boolean 
     clickedControlName = .Name 
    End If 
    End With 
End Sub 

Option Explicit 

Dim frames() As New clsFrames 
Dim labels() As New clsLabels 

Private Sub createFrameListeners() 
    Dim ctl As msForms.Control 
    Dim frameCount as Long 
    For Each ctl In Me.Controls 
    '  Debug.Print TypeName(ctl): Stop 
     If TypeName(ctl) = "Frame" Then 
     frameCount = frameCount + 1 
     ReDim Preserve frames(1 To frameCount) 
     'Create the Frame Listener objects 
     Set frames(frameCount).classFrames = ctl 
     End If 
    Next ctl 
End Sub 

Private Sub createLabelListeners() 
Dim ctl As msForms.Control 
Dim LabelCount as Long 
    For Each ctl In Me.Controls 
    '  Debug.Print TypeName(ctl): Stop 
    If TypeName(ctl) = "Label" Then 
     LabelCount = LabelCount + 1 
     ReDim Preserve labels(1 To LabelCount) 
     'Create the Label Listener objects 
     Set labels(LabelCount).classLabels = ctl 
    End If 
    Next ctl 
End Sub 

Function blinkThisControl(ctrl As Control, ByVal blinkCount As Long) 
    isClickDetected = False 
    Dim i As Integer 
    For i = 1 To blinkCount 

     ' <blink ctrl twice> 

     DoEvents 
     If isClickDetected Then Exit Function 
     'name of clicked control will be in clickedControlName 
    Next i 
End Function 

Private Sub userform_initialize() 
Call createFrameListeners 
Call createLabelListeners 

' do other stuff 


End Sub 
関連する問題