【问题标题】:global click event handler (WithEvents)全局点击事件处理程序 (WithEvents)
【发布时间】:2010-08-06 14:10:18
【问题描述】:

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

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

''# 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

表格代码

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

【问题讨论】:

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

标签: ms-access vb6 vba


【解决方案1】:

您是否缺少Set?公共属性集应该是

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

【讨论】:

  • 在 VBA 中,我们使用 Property Let 代替 Property Set,尽管 VBA 两者都支持。帮助文件说您应该为任何返回对象的属性使用属性集,但我已经使用 Property Let 没有问题。这与属性定义中的 Set 无关。可能 Property Set 更合适,但我从来没有遇到过使用(或没有注意到它!)的 Access VBA 代码。
  • 当我使用“Let”时,我得到以下错误“无效使用属性” [CODE] Public Sub initTextBoxEventHandler() Dim eventHandler As TextBoxEventHandler Set eventHandler = New TextBoxEventHandler Set eventHandler.TextBox = Me.txt_F_in txtBxCollection.Add eventHandler Set eventHandler = Nothing End Sub [/CODE]
  • 我一直以此为参考stackoverflow.com/questions/1083603/…
  • OK -- 使用 WithEvents 肯定有所不同,我从来没有理由使用过它(尽管我在文件搜索类模块中确实考虑过它的进度条)。跨度>
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    相关资源
    最近更新 更多