2

ユーザーフォームで、フレームの可視性を切り替えて、フレームのオフ/オンを点滅させています。さまざまな回数点滅してから停止しますが、点滅の間にユーザーのアクティビティをチェックします。フォームまたは含まれているコントロールのいずれかでマウス クリックがあった場合、点滅はすぐに停止します。

私のウインカーはこんな感じです。

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

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

4

2 に答える 2

3

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

次に、このグローバル ブール変数が で true かどうかを確認してください<click detected>

于 2011-08-13T01:38:39.857 に答える
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
于 2011-08-15T06:55:47.550 に答える