【问题标题】:Class for Custom Button Event Handling自定义按钮事件处理类
【发布时间】:2018-03-23 06:27:10
【问题描述】:

1) 我有一个带有一些按钮的表单(它在 Access 中,但我想它也适用于 Excel)。

2) 我有一个自定义类可以帮助我调试该表单(以及我可能添加的未来表单)。

该类仅在表单事件触发时进行记录,例如加载、卸载、脏、退出。

我希望该类能够在单击按钮时进行记录。

我知道这可以通过使用标准模块并在那里加载公共集合来完成。或者直接使用表单的事件。或者通过存储在表单后面的集合中。

但如果可能的话,我希望将它全部封装在我的调试类中。然后在我添加的每个新表单的 Form_Load 事件中添加简单的两行代码。

我在下面的简化尝试仅捕获添加到类集合中的 last 按钮的事件,即。按钮 3。

TestButtons(带有 Button1、Button2 和 Button3 的表单)

Private Buttons As CButtons

Private Sub Form_Load()
    Set Buttons = New CButtons
    Buttons.LoadButtons Me
End Sub

CButtons(类):

Public WithEvents btn As Access.CommandButton
Private AllButtons As Collection

Const MODE_DEBUG As Boolean = True

Public Sub LoadButtons(ByRef TheForm As Access.Form)

    Dim ctl As Control

    Set AllButtons = New Collection
    For Each ctl In TheForm.Controls
        If ctl.ControlType = acCommandButton Then
            Set btn = ctl
            btn.OnClick = "[Event Procedure]"
            AllButtons.Add btn
        End If
    Next ctl

End Sub

Private Sub btn_Click()
    If MODE_DEBUG Then debug.print btn.Name & "_Click"
End Sub

想知道有没有人给点建议,谢谢!

【问题讨论】:

    标签: excel ms-access vba


    【解决方案1】:

    您无法处理集合中的事件。最简单的解决方案是使用单独的类来处理按钮事件,在多个按钮处理程序中创建这些类的集合,并将按钮从处理单个按钮的类传递给处理事件中的多个按钮的类。

    CSingleButton

    Public buttonsHandler As CButtons
    Public WithEvents btn As Access.CommandButton
    
    Private Sub btn_Click()
        buttonsHandler.HandleClick btn
    End Sub
    

    CButtons

    Private ButtonHandlers As Collection
    
    Const MODE_DEBUG As Boolean = True
    
    Public Sub LoadButtons(ByRef TheForm As Access.Form)
    
        Dim ctl As Control
        Dim btnHandler As CSingleButton
        Set ButtonHandlers = New Collection
        For Each ctl In TheForm.Controls
            If ctl.ControlType = acCommandButton Then
                Set btnHandler = New CSingleButton
                Set btnHandler.btn = ctl
                Set btnHandler.buttonsHandler = Me
                ctl.OnClick = "[Event Procedure]"
                ButtonHandlers.Add btnHandler
            End If
        Next ctl
    
    End Sub
    
    Public Sub HandleClick(btn As Access.CommandButton)
        If MODE_DEBUG Then debug.print btn.Name & "_Click"
    End Sub
    

    【讨论】:

    • 完美运行!非常感谢您的建议,以及有用的修改代码@ErikvonAsmuth
    猜你喜欢
    • 1970-01-01
    • 2017-09-03
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多