Вопрос по events, event-handling, vba – VBA: Использование WithEvents на пользовательских формах

19

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

Ваш Ответ

2   ответа
2

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

Option 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

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

Sub TextBox_ChangeEvent(Index As Integer)
  CommonChangeEvent
End Sub

Sub OtherControlType_ChangeEvent(Index As Integer)
  CommonChangeEvent
End Sub

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

Error: User Rate Limit Exceededsiddharthrout.com/index.php/2018/01/15/vba-control-arrays
Error: User Rate Limit Exceeded
24

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

Например, создайте класс с именем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

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

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

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

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

Error: User Rate Limit ExceededinstanceError: User Rate Limit Exceeded
Error: User Rate Limit ExceededHere is my question
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededCheckBoxError: User Rate Limit ExceededMSForms.CheckBoxError: User Rate Limit Exceeded

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