2010-08-06 61 views
4

我想创建一个类模块,它将作为一个全局处理程序,当有人点击我在窗体中的六十个文本框中的一个时。 Th文本框代表本周显示信息的计时卡,包括时钟输入,计时输出,午餐开始,结束,持续时间,每周七天内每天的总时数。当某人在一天内点击任何一个盒子时,所有盒子都会解锁并启用,以便用户可以编辑它们中的信息。全球点击事件处理程序(WithEvents)

在网络中寻找全局点击事件的解决方案后,我发现我可以创建一个类模块来处理事件,而无需为每个调用分离函数来处理事件的单个文本框创建单击事件。我遇到的问题是我的课程模块似乎没有处理我的活动,并想知道是否有人可以为我的问题提出解决方案。仅供参考,我所有的文本框和锁定和禁用,以防止数据损坏。下面是我的代码:

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

我想出了我在设置文本框的类模块中的问题我忘了添加“TC_txtbox.OnClick =”[Event Procedure]“” 如果未在您想要处理的事件的属性中声明[事件过程],则在我的扩展文本框中,VBA不会触发自定义处理程序 – Talguy 2010-08-06 19:14:55

回答

1

我在类模块中找出我的问题我在哪里设置文本框我忘了补充"TC_txtbox.OnClick = "[Event Procedure]"" VBA将不会触发自定义在我,如果[事件过程延长文本框,甚至处理]没有在你想要处理的事件属性中声明

+0

哇,很好 – 2017-02-11 19:56:14

1

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

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

在VBA中,我们使用Property Let而不是属性集,尽管VBA支持两者。帮助文件说你应该为任何返回一个对象的属性使用属性集,但是我已经使用Property Let来解决这个问题。这与属性定义中的Set无关。可能属性集合是更合适的,但我从来没有碰到Access VBA代码使用(或没有注意到它!)。 – 2010-08-06 17:55:28

+0

当我用 “让” 我得到的folling错误 “无效使用的财产” [CODE] 公用Sub initTextBoxEventHandler() 昏暗的事件处理程序作为TextBoxEventHandler 设置事件处理程序=新TextBoxEventHandler 设置eventHandler.TextBox = Me.txt_F_in txtBxCollection.Add事件处理程序 集事件处理器=无 结束子 [/ CODE] – Talguy 2010-08-06 18:09:55

+1

我已经使用此作为参考http://stackoverflow.com/questions/1083603/vba-using-withevents-on-userforms – Talguy 2010-08-06 18:17:09

相关问题