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]
。您仍然需要为函数指定参数。
我在 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]
。您仍然需要为函数指定参数。