Кажется, это работает нормально, но похоже, что много кода просто для обнаружения щелчка мышью.Например, я подумал, что можно создать класс, содержащий все элементы управления формой, чтобы я мог обнаружить щелчок по любому из них за один раз, не проверяя каждый вид элемента управления отдельно.Я не мог сделать эту работу, и я надеюсь, что кто-то может улучшить это.
Просто чтобы повторить, что это делает: В пользовательской форме большой фрейм с именем 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