vba 全局点击事件处理程序(WithEvents)

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3424564/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-11 11:58:27  来源:igfitidea点击:

global click event handler (WithEvents)

ms-accessvbavb6access-vba

提问by Talguy

I am trying to create a class module that will act as a global handler for when ever someone clicks one of the sixty textboxes I have in my form. Th textboxes represent a timecard for the week displaying information as clock in, clock out, lunch start,end,duration, total daily hours under each fo the seven days of the week. When someone clicks anyone of the boxes under a day all the boxes will unlock and enable so that the user can edit the information in them.

我正在尝试创建一个类模块,当有人单击我的表单中的 60 个文本框之一时,它将充当全局处理程序。文本框表示一周的时间卡,显示的信息包括每周 7 天的打卡、打卡、午餐开始、结束、持续时间、每日总小时数。当有人在一天内单击任何一个框时,所有框都将解锁并启用,以便用户可以编辑其中的信息。

After scouring the web for a solutio of a global click event I found that I could create a class module that would handle the event without create a click event for every single text box that calls a seperate function to handle the event. The problem I am having is that my class module doesn't seem to be handling my event and was wondering if someone could suggest a solution to my problem. FYI, All my textboxes and locked and disabled to prevent data corruption. Below is my code:

在网上搜索全局单击事件的解决方案后,我发现我可以创建一个类模块来处理该事件,而无需为调用单独函数来处理事件的每个文本框创建单击事件。我遇到的问题是我的类模块似乎没有处理我的事件,并且想知道是否有人可以建议解决我的问题。仅供参考,我所有的文本框都已锁定和禁用以防止数据损坏。下面是我的代码:

''# Class module    
    Option Compare Database
    Option Explicit

    Public WithEvents TC_txtbox As TextBox
    ''# Set the textbox so that its events will be handled
    Public Property Set TextBox(ByVal m_tcTxtBox As TextBox)
        TC_txtbox = m_tcTxtBox
    End Property


    ''# Handle and onClick event of the
    Private Sub TC_txtbox_Click()
        ''# Find out the controls that where clikck
        Debug.Print Form_TimeCard.ActiveControl.Name
        Dim ctl As Control
        For Each ctl In access.Forms.Controls
            Debug.Print ctl.Name
        Next ctl
    End Sub

Form Code

表格代码

Option Compare Database
Option Explicit
''# Global Variables
Public clk_inout As Boolean
Public settings
Public weekDict
Public weekOf As Variant
Public curDay As Variant
Public txtBxCollection As Collection
''# Event Handler for when the form opens
Private Sub Form_Open(Cancel As Integer)
    ''# Configure varaibles
    Me.TimerInterval = 60000 ''# 10 sec Interval
    weekOf = getFirstDayofWeek(Date)
    curDay = Date
    Set weekDict = CreateObject("Scripting.Dictionary")
    Set settings = CreateObject("Scripting.Dictionary")
    Set txtBxCollection = New Collection

    ''# Load Time Card Data
    Call initSettings
    ''# Debug.Print "Work Day Goal " & settings.Item("Work_day_goal_hrs")
    Call initDict
    Call initTextBoxEventHandler
    Debug.Print "Collection count " & txtBxCollection.Count
    Call loadDates(Date)
    Call clearDay
    Call selectDay(Date)
    Call loadWeeksData(weekOf)

    Dim ctl As Control
    Set ctl = weekDict.Item(Weekday(curDay)).Item("In")

    If IsDate(ctl.Value) And (Not ctl.Value = "") Then
        Me.but_clk_inout.Caption = "Clock Out"
        Me.but_lunch.Visible = True
        clk_inout = False
    Else
        Me.but_clk_inout.Caption = "Clock In"
        Me.but_lunch.Visible = False
        clk_inout = True
    End If
    ''# Debug.Print "Work Day Goal " & settings.Item("Salary")
End Sub

Public Sub initTextBoxEventHandler()
    Dim eventHandler As TextBoxEventHandler
    Set eventHandler = New TextBoxEventHandler
    Debug.Print "Collection count " & txtBxCollection.Count
    Set eventHandler.TextBox = Me.txt_F_in
    txtBxCollection.Add eventHandler

    Debug.Print "Collection count " & txtBxCollection.Count
End Sub

采纳答案by Talguy

I figure out My problem in the class module where I am setting the text box I forgot to add "TC_txtbox.OnClick = "[Event Procedure]""VBA will not fire the custom even handler in my extended textbox if [Event Procedure] is not declared in the property of the event you would like to handle

我找出了我在设置文本框的类模块中的问题"TC_txtbox.OnClick = "[Event Procedure]""如果在您想要的事件的属性中未声明 [​​Event Procedure] ,则我忘记添加VBA 将不会触发扩展文本框中的自定义偶数处理程序处理

回答by MarkJ

Are you missing a Set? The public property set should be

你缺一个Set吗?公共属性集应该是

Public Property Set TextBox(ByVal m_tcTxtBox As TextBox)  
  Set TC_txtbox = m_tcTxtBox  ' dont forget the Set! '
End Property