我正在构建一个表单Access,其中包含大量TextBox控件。每个人的GotFocus()
事件将完全相同:
Private Sub Text1_GotFocus()
Text1.BorderColor = RGB(100, 100, 255)
...
End Sub
Private Sub Text2_GotFocus()
Text2.BorderColor = RGB(100, 100, 255)
...
End Sub
'... ad infinitum
这自然是一场维护噩梦,在美学上我必须继续滚动过去。我可以将BorderColor = RGB(100, 100, 255)
等抛出到一个函数中并让每个处理程序调用该函数,但是我仍然为每个TextBox留下3行相同的块 - 抛出LostFocus
和其他处理的事件同样地,无论TextBox如何,它都变得愚蠢。
因此,明智的做法是使用单个AllTextBoxes_GotFocus()
方法,并让每个TextBox的On Got Focus
事件指向该方法。但有两个问题:
[Event Procedure]
(生成标准Private Sub Text1_GotFocus()
方法)和应用程序中的任何宏。这是......奇怪的。考虑到宏有一个RunCode
选项来调用VBA函数,它似乎是一种奇怪的循环方式调用代码,必须让控件调用宏来调用代码。当然有更好的方法(我认为Macros只能在模块中调用函数,而不是在表单上调用函数)。Private Sub Text1_GotFocus(ByVal sender As System.Object, ByVal e As System.EventArgs)
,但VBA没有。{/ li>
如何使用单个处理程序处理mutliple事件,并在处理程序中获取事件的发送者?
答案 0 :(得分:2)
我是这样做的,但知道这会覆盖任何自定义的GotFocus事件
Private Sub Form_Load()
On Error Resume Next
Dim ctrl As Control
For Each ctrl In Me.Form.Controls
If ctrl.ControlType = acTextBox Then
ctrl.GotFocus = "=changeColor('" & ctrl.name & "',100,100,255)"
'For LostFocus
ctrl.LostFocus = "=changeColor('" & ctrl.name & "')"
End If
Next ctrl
End Sub
Function changeColor(field As String, Optional red AS Integer =0 ,green AS Integer =0,blue As Integer = 0)
Me.Form.Controls(field).BorderColor = RGB(red, green, blue)
End Function