Обнаружение события нажатия мыши на динамических объектах в пользовательской форме - PullRequest
1 голос
/ 01 мая 2019

У меня есть динамический диапазон OptionButtons внутри кадра в пользовательской форме. Количество OptionButton-ов зависит от количества столбцов в таблице. Каждая кнопка помечена в соответствии с меткой столбца. Когда человек выбирает опцию, мне нужно заполнить ListBox элементами, найденными в этом столбце таблицы. Заполнение опциональных кнопок и ListBox достаточно просто. Я знаю, как обнаружить события нажатия мыши на известных объектах Userform. Но кнопки существуют только через кодирование и меняются. Как обнаружить MouseDown на объекте, который на самом деле не существует? Я пробовал код для создания класса MouseDown для фрейма

1 Ответ

1 голос
/ 01 мая 2019

Вам нужно обернуть элементы управления в модуле класса - скажем, DynamicOptionButton:

Option Explicit
Private WithEvents ControlEvents As MSForms.OptionButton

Public Sub Initialize(ByVal ctrl As MSForms.OptionButton)
    If Not ControlEvents Is Nothing Then ThrowAlreadyInitialized
    Set ControlEvents = ctrl
End Property

Private Property Get AsControl() As MSForms.Control
    Set AsControl = ControlEvents
End Property

Private Sub ThrowAlreadyInitialized()
    Err.Raise 5, TypeName(Me), "Invalid Operation: This control is already initialized."
End Sub

Private Sub ControlEvents_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim parentForm As UserForm1 'todo: use your actual UserForm subtype
    Set parentForm = AsControl.Parent 
    'handle mousedown here.
End Sub

Когда вы создаете динамические элементы управления, вам понадобится уровень модуля Collection для хранения DynamicOptionButton экземпляров - в противном случае они выйдут из области действия при достижении End Sub, и вы никогда не сможете обработать их события.

Private DynamicControls As Collection

Private Sub Class_Initialize()
    Set DynamicControls = New Collection
    'todo invoke CreateOptionButton
End Sub

Private Sub CreateOptionButton() 'todo parameterize
    Dim ctrl As MSForms.OptionButton
    Set ctrl = Me.Controls.Add(...)

    Dim wrapper As DynamicOptionButton
    Set wrapper = New DynamicOptionButton
    wrapper.Initialize ctrl

    DynamicControls.Add wrapper
End Sub
...