我有一个Word用户表单,包含60多种不同类型的控件。我想在每次触发control_change事件时评估表单并更改表单的提交按钮的启用状态。但是,我真的不想在更改事件处理程序上编写和维护60。
答案 0 :(得分:25)
您可以创建一个事件接收器类,其中包含特定类型的所有控件的事件处理代码。
例如,创建一个名为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
请注意,您需要将事件处理程序实例添加到集合的原因只是为了确保它们仍然被引用,因此在完成它们之前不会被垃圾收集器丢弃。
显然,这种技术可以扩展到处理其他类型的控制。您可以为每种类型分别设置事件处理程序类,也可以为需要处理的每种控件类型使用一个具有成员变量(以及关联的属性和事件处理程序)的类。
答案 1 :(得分: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
结合这两个选项,您的总事件处理程序计数将大大缩小,其余处理程序只是一个真正的事件处理程序的无脑存根。