ms-access - 如何通过 MS-Access VBA 中的 TextBox.OnKeyUp 属性传递 KeyCode

标签 ms-access events vba parameter-passing

在 MS Access 中,我使用 VBA 为多个文本框设置事件处理函数:

txtMyTextBox.OnKeyUp = "=myEventHandlerFunction()"

到目前为止,效果很好。但是我想传递已按下的键的 KeyCode。当我为 TextBox 手动创建“常规”KeyUp 事件时,它会自动提供 KeyCode As IntegerShift As Integer。我期望这些也可以与 OnKeyUp 属性一起使用,如下所示:

txtMyTextBox.OnKeyUp = "=myEventHandlerFunction(KeyCode)"

当然,我更新了 myEventHandlerFunction,以便它需要这个参数。但是,当触发该事件时,Access 会给出错误,指出该表达式导致错误,因为该对象不包含自动化对象KeyCode

是否有可能如何使用 OnKeyUp 属性为 myEventHandlerFunction 提供 KeyCode?我是否使用了错误的格式,甚至错误的参数名称(我正在使用德语版的 Access,如果这很重要的话)?

MSDN documentation on the TextBox.OnKeyUp Property (Access)没有提供任何相关信息。

我知道我可以为每个 TextBox 手动设置 KeyUp 事件,并使用 KeyCode 参数从那里调用 myEventHandlerFunction。这不是我想要的,因为我想以编程方式设置事件处理,并且据我了解,这需要使用 OnKeyUp 属性。

最佳答案

问题在于您处理事件的方式。您不应将程序处理程序设置为文本表达式,而应使用类和 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

这有很多优点,例如能够在表单模块中为某些控件使用附加处理程序,以及能够引用在处理程序中调用事件的控件。

关于ms-access - 如何通过 MS-Access VBA 中的 TextBox.OnKeyUp 属性传递 KeyCode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49789635/

相关文章:

mysql - 将表从在 MS Access 应用程序之上编写的应用程序导入到 MySQL

JavaScript 在 for 循环中返回 var

C# 事件去抖动

excel - Worksheet_FollowHyperlink 和 MsgBox 在 Excel 2010 中不起作用

c# - 部署带有数据库的 C# 程序以在 LAN 上工作的建议

sql-server - MS Access 链接表缺少主键

excel - 如何获取 ListObject 的 HeaderRowRange 的子集?

excel - 如何使循环同时运行所有 X 和 Y 值,现在它运行所有 Y 值,然后运行所有 X 值

mysql - Access 中的数据单元 "#Deleted"- ODBC、MySQL 和 BIGINT 唯一 ID

c# - 事件 ‘System.Windows.Controls.MediaElement.MediaOpened’只能出现在+ =或-=的左侧