Поместите код в цикл, чтобы выйти из цикла после любого щелчка мышью - PullRequest
2 голосов
/ 13 августа 2011

В пользовательской форме я мигаю кадр Выкл / Вкл, переключая его видимость.Он мигает переменное число раз, а затем останавливается, но между миганиями проверяет активность пользователя.Если в любом месте формы или любого из содержащихся в ней элементов управления был щелчок мыши, то мигание немедленно прекращается.

Так выглядит мой мигалка.

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

Все отлично работает, кроме части <click detected>.Как мне сделать это из цикла?

Ответы [ 2 ]

3 голосов
/ 13 августа 2011

Вы пытались изменить глобальную логическую переменную для события mouseclick на true (по умолчанию false)?

Затем попробуйте проверить, является ли эта глобальная логическая переменная true в <click detected>.

0 голосов
/ 15 августа 2011

Кажется, это работает нормально, но похоже, что много кода просто для обнаружения щелчка мышью.Например, я подумал, что можно создать класс, содержащий все элементы управления формой, чтобы я мог обнаружить щелчок по любому из них за один раз, не проверяя каждый вид элемента управления отдельно.Я не мог сделать эту работу, и я надеюсь, что кто-то может улучшить это.

Просто чтобы повторить, что это делает: В пользовательской форме большой фрейм с именем 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
...