在MS Access中,我使用VBA为多个TextBox设置事件处理函数:
txtMyTextBox.OnKeyUp = "=myEventHandlerFunction()"
到目前为止,这个工作正常。但是,我想传递已按下的键的KeyCode。当我为TextBox手动创建“常用”KeyUp事件时,它会自动提供 KeyCode As Integer 和 Shift As Integer 。我期待这些也可以与OnKeyUp属性一起使用,如下所示:
txtMyTextBox.OnKeyUp = "=myEventHandlerFunction(KeyCode)"
当然我更新了myEventHandlerFunction,以便它需要这个参数。但是,当事件被触发时,Access会给我一个错误,说该表达式导致错误,因为该对象不包含自动化对象 KeyCode 。
我是否有可能使用OnKeyUp属性为KeyEode提供myEventHandlerFunction?我使用了错误的格式甚至是错误的参数名称(如果重要的话,我使用的是德语版的Access)?
MSDN documentation on the TextBox.OnKeyUp Property (Access)未提供有关此内容的任何信息。
我知道我可以为每个TextBox手动设置KeyUp事件,并使用KeyCode参数从那里调用myEventHandlerFunction。这不是我想要的,因为我想以编程方式设置事件处理,根据我的理解,这需要使用OnKeyUp属性。
答案 0 :(得分:3)
问题在于你处理事件的方式。您不应将程序处理程序设置为文本表达式,而是使用类和OOP为文本框设置事件处理程序。
示例:
使用以下类:
<强> clsTextboxHandler 强>
Public textboxesHandler As clsTextboxesHandler
Public WithEvents txt As Access.Textbox
Private Sub txt_KeyUp(KeyCode As Integer, Shift As Integer)
textboxesHandler.HandleKeyUp txt, KeyCode, Shift
End Sub
<强> clsTextboxesHandler 强>
Private TextboxHandlers As Collection
Private Sub Class_Initialize()
Set TextboxHandlers = New Collection
End Sub
Public Sub LoadAllTextboxes(ByRef TheForm As Access.Form)
Dim ctl As Control
For Each ctl In TheForm.Controls
If ctl.ControlType = acTextbox Then 'Add additional criteria to only handle certain textboxes
LoadTextbox ctl
End If
Next ctl
End Sub
Public Sub LoadTextbox(txt As Access.Textbox)
Dim TextboxHandler As New clsTextboxHandler
Set TextboxHandler.txt= txt
Set TextboxHandler.textboxesHandler = Me
txt.OnKeyUp = "[Event Procedure]"
TextboxHandlers.Add TextboxHandler
End Sub
Public Sub HandleKeyUp(txt As Access.Textbox, KeyCode As Integer, Shift As Integer)
'Handle your KeyUp for multiple textboxes here. You can use the textbox object, keycode, etc.
End Sub
在表格上:
Private TextboxesHandler As clsTextboxesHandler
Public Sub Form_Load()
Set TextboxesHandler = New clsTextboxesHandler
TextboxesHandler.LoadAllTextboxes Me
End Sub
这有很多优点,例如能够在表单模块中为某些控件使用其他处理程序,并且能够引用在处理程序中调用事件的控件。