MS Access:用通用的点击事件替换许多点击事件

MS Access: Replace Many On Click Events with Generic On Click Event

我在 MS Access 中有一个表单,顶部有 12 个按钮 运行 作为列 headers。对于每个按钮,都有一个 On Click 事件调用相同的 public 函数。此函数(如下所示)为与单击的按钮对应的字段打开过滤器菜单。

Public Function HeaderClick(HeaderName As String) 
    DoCmd.GoToControl "[" & HeaderName & "]"
    DoCmd.RunCommand acCmdFilterMenu
End Function

例如,我单击“名字”按钮,它会拉出“名字”的过滤器菜单:

我想知道是否有一种方法可以在单击这些按钮中的任何一个时调用 HeaderClick。换句话说,我想要一个替代方法来创建 12 个单独的单击事件。原因是这是我在许多数据库中的许多表单上使用的技术。只是看起来效率不高。

你会创建一个 class,我已经这样命名我的 clsCustomButton

Option Explicit

Private WithEvents cmdCustom As CommandButton

Public Sub Initialise(cmdIn As CommandButton)
    Set cmdCustom = cmdIn
    cmdCustom.OnClick = "[Event Procedure]"
End Sub

Private Sub cmdCustom_Click()
    MsgBox "Hello"
End Sub

Private Sub Class_Terminate()
    Set cmdCustom = Nothing
End Sub

在标准代码模块中,您需要 collection/array 来容纳这个“新”自定义按钮,我将其称为 colButtons

Option Explicit

Public colButtons As Collection

然后您需要通过传入要更改的按钮来添加到集合中,我刚刚完成了一个,但是您可以循环所有按钮或指定使用 tag/name 来执行此操作。像这样,从表格中,通常在打开时

Dim clsCommandButton As clsCustomButton

Set colButtons = New Collection
    
Set clsCommandButton = New clsCustomButton

clsCommandButton.Initialise Me.Command0

colButtons.Add clsCommandButton, CStr(colButtons.Count)

另一个示例是我的 Windows Phone 主题颜色 选择器,其中捕获了对 文本框 的点击:

形式:

Option Explicit

' Form to display the Windows Phone 7.5/8.0 colour theme.
' Also works as a basic example of implementing WithEvents for a form.
' 2017-04-19. Gustav Brock, Cactus Data ApS, CPH.
' Version 1.0.0
' License: MIT.

' *

Private ControlCollection   As Collection

Private Sub Form_Load()

    ' Load events for all colour value textboxes.
    
    Dim EventProcedure  As ClassTextboxSelect
    Dim Control         As Access.Control
    
    Set ControlCollection = New Collection
    
    For Each Control In Me.Controls
        If Control.ControlType = acTextBox Then
            Set EventProcedure = New ClassTextboxSelect
            EventProcedure.Initialize Control
            ControlCollection.Add EventProcedure, Control.Name
        End If
    Next
    
    Set EventProcedure = Nothing
    Set Control = Nothing
    
End Sub


Private Sub Form_Unload(Cancel As Integer)

    ' Unload events for all colour value textboxes.
    
    Dim EventProcedure  As ClassTextboxSelect
    
    For Each EventProcedure In ControlCollection
        EventProcedure.Terminate
    Next
    
    Set EventProcedure = Nothing
    Set ControlCollection = Nothing

End Sub

Class:

Option Explicit

' Helper class for form Palette for event handling of textboxes.
' 2017-04-19. Gustav Brock, Cactus Data ApS, CPH.
' Version 1.0.0
' License: MIT.

' *

Private Const EventProcedure    As String = "[Event Procedure]"

Private WithEvents ClassTextBox As Access.TextBox
Attribute ClassTextBox.VB_VarHelpID = -1

Public Sub Initialize(ByRef TextBox As Access.TextBox)

    Set ClassTextBox = TextBox    
    ClassTextBox.OnClick = EventProcedure
    
End Sub


Public Sub Terminate()

    Set ClassTextBox = Nothing

End Sub


Private Sub ClassTextBox_Click()

    ' Select full content.
    ClassTextBox.SelStart = 0
    ClassTextBox.SelLength = Len(ClassTextBox.Value)
    ' Display the clicked value.
    ClassTextBox.Parent!CopyClicked.Value = ClassTextBox.Value
    ' Copy the clicked value to the clipboard.
    DoCmd.RunCommand acCmdCopy

End Sub

完整代码、可供下载的 Access 应用程序和文档位于 VBA.ModernTheme

当您单击 OnClick 文本框以添加新函数时,您通常会看到文本 [Event Procedure]。只需用函数的名称覆盖它(确保函数在全局模块中)。因此,您可以键入 =HeaderClick("Name") 而不是 [Event Procedure]。您仍然需要为函数指定参数。