2

我正在构建一个带有大量 TextBox 控件的表单 Access。他们每个人的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)etc 放入一个函数中,并让每个处理程序调用该函数,但是对于每个 TextBox,我仍然留下 3 行相同的块 - 抛出LostFocus和其他事件处理方式相同,而与 TextBox 无关,它只是变成愚蠢的。

因此,明智的做法是拥有一个AllTextBoxes_GotFocus()方法,并让每个 TextBox 的On Got Focus事件都指向该方法。不过有两个问题:

  • 我在表单设计器的下拉列表中看不到我在 VBA 中定义的任何函数或子项,只有[Event Procedure](生成标准Private Sub Text1_GotFocus()方法)和应用程序中的任何宏。这是……奇怪。考虑到宏有一个RunCode调用 VBA 函数的选项,这似乎是一种奇怪的循环调用代码的方式,必须让控件调用宏来调用代码。当然有更好的方法(我认为宏只能在模块中调用函数,而不是在表单上)。
  • 我不确定如何获取发件人,因此我可以设置适当的控件边框。VB.NET 在其 events: 中传入发送者和事件参数Private Sub Text1_GotFocus(ByVal sender As System.Object, ByVal e As System.EventArgs),但 VBA 没有。

如何使用单个处理程序处理多个事件,并在处理程序中获取事件的发送者?

4

1 回答 1

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
于 2013-11-05T17:26:15.503 回答