VBA: Использование WithEvents на UserForms

Это - просто соглашение, но вероятно более удобный, чем альтернатива. Со статическим основным все необходимо знать для вызова программы Java, название и местоположение класса. Если бы это не было статично, необходимо было бы также знать, как инстанцировать того класса или потребовать, чтобы класс имел пустого конструктора.

19
задан Deduplicator 24 February 2015 в 20:51
поделиться

2 ответа

В этом случае у вас есть несколько вариантов, потому что обработчики событий не могут использоваться совместно в VBA / VB6

Вариант 1: Используйте функцию централизованной обработки, которая вызывается из каждого обработчика событий.

Sub Control1_ChangeEvent()
  CommonChangeEvent // Just call the common handler, parameters as needed
End Sub

Sub Control2_ChangeEvent()
  CommonChangeEvent
End Sub
...
Sub CommonChangeEvent(/* Add necessary parameters */)
  //Do the heavy lifting here
End Sub

Вариант 2: Организуйте элементы управления в массивах элементов управления.

Sub TextBox_ChangeEvent(Index As Integer)
  CommonChangeEvent
End Sub

Sub OtherControlType_ChangeEvent(Index As Integer)
  CommonChangeEvent
End Sub

При объединении обоих вариантов общее количество обработчиков событий значительно сократится, а остальные обработчики будут просто безмозглыми. заглушки для одного истинного обработчика событий.

2
ответ дан 30 November 2019 в 04:08
поделиться

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

Например, создайте класс с именем TextBoxEventHandler следующим образом:

Private WithEvents m_oTextBox as TextBox

Public Property Set TextBox(ByVal oTextBox as TextBox)
    Set m_oTextBox = oTextBox
End Property

Private Sub m_oTextBox_Change()
    ' Do something
End Sub

Теперь вам нужно создать и подключить экземпляр этого класса для каждого элемента управления соответствующего типа в вашей форме:

Private m_oCollectionOfEventHandlers As Collection

Private Sub UserForm_Initialise()

    Set m_oCollectionOfEventHandlers = New Collection

    Dim oControl As Control
    For Each oControl In Me.Controls

        If TypeName(oControl) = "TextBox" Then

            Dim oEventHandler As TextBoxEventHandler
            Set oEventHandler = New TextBoxEventHandler

            Set oEventHandler.TextBox = oControl

            m_oCollectionOfEventHandlers.Add oEventHandler

        End If

    Next oControl

End Sub

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

Очевидно, что этот метод может быть расширен для работы с другими типами управления. Вы можете либо иметь отдельные классы обработчиков событий для каждого типа, либо использовать один класс, который имеет переменную-член (и связанные свойства и обработчик событий) для каждого из типов элементов управления, с которыми вам нужно работать.

Private m_oCollectionOfEventHandlers As Collection

Private Sub UserForm_Initialise()

    Set m_oCollectionOfEventHandlers = New Collection

    Dim oControl As Control
    For Each oControl In Me.Controls

        If TypeName(oControl) = "TextBox" Then

            Dim oEventHandler As TextBoxEventHandler
            Set oEventHandler = New TextBoxEventHandler

            Set oEventHandler.TextBox = oControl

            m_oCollectionOfEventHandlers.Add oEventHandler

        End If

    Next oControl

End Sub

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

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

Private m_oCollectionOfEventHandlers As Collection

Private Sub UserForm_Initialise()

    Set m_oCollectionOfEventHandlers = New Collection

    Dim oControl As Control
    For Each oControl In Me.Controls

        If TypeName(oControl) = "TextBox" Then

            Dim oEventHandler As TextBoxEventHandler
            Set oEventHandler = New TextBoxEventHandler

            Set oEventHandler.TextBox = oControl

            m_oCollectionOfEventHandlers.Add oEventHandler

        End If

    Next oControl

End Sub

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

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

28
ответ дан 30 November 2019 в 04:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: