2010-08-06 4 views
4

Я пытаюсь создать модуль класса, который будет действовать как глобальный обработчик, когда кто-либо щелкнет одно из шестидесяти текстовых полей, которые у меня есть в моей форме. Текстовые поля представляют собой временную таблицу для отображения информации в виде часов, часов, обеда, конца, продолжительности, общего ежедневного часа по каждой из семи дней недели. Когда кто-то нажимает на кого-либо из ящиков меньше дня, все блоки будут разблокированы и включены, чтобы пользователь мог редактировать информацию в них.global click event handler (WithEvents)

После очистки веб-сайта от глобального глобального события щелчка я обнаружил, что могу создать модуль класса, который обрабатывал бы событие без создания события click для каждого отдельного текстового поля, которое вызывает отдельную функцию для обработки события. Проблема, с которой я сталкиваюсь, заключается в том, что мой модуль классов, похоже, не обрабатывает мое событие, и мне было интересно, может ли кто-нибудь предложить решение моей проблемы. FYI, все мои текстовые поля и заблокированы и отключены, чтобы предотвратить повреждение данных. Ниже мой код:

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

ответ

1

выясню Моя проблема в модуле класса, где я устанавливаю текстовое поле, я забыл добавить "TC_txtbox.OnClick = "[Event Procedure]"" VBA не будет срабатывать Обычай даже обработчика в моем расширенном текстовом поле, если [Процедура обработки событий ] не объявлен в свойстве события, которое вы хотели бы обрабатывать

+0

wow, good catch –

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 вместо Property Set, хотя VBA поддерживает оба. В файле справки говорится, что вы должны использовать набор свойств для любого свойства, которое возвращает объект, но я использовал свойство Let для этого без проблем. Это не зависит от Set в определении свойства. Вероятно, свойство Set более правильное, но я никогда не сталкивался с кодом доступа VBA, который использует (или не замечал этого!). –

+0

Когда я использую "Пусть" я получаю феллинг ошибка "Invalid использование имущества" [CODE] Public Sub initTextBoxEventHandler() Dim EventHandler Как TextBoxEventHandler Set EventHandler = Новый TextBoxEventHandler Set eventHandler.TextBox = Me.txt_F_in txtBxCollection.Add EventHandler Set EventHandler = Nothing End Sub [/ CODE] – Talguy

+1

Я использовал это в качестве ссылки http://stackoverflow.com/questions/1083603/vba-using-withevents-on-userforms – Talguy