【问题标题】:Ms access vba sink (catch) keydown event from a formless subformMs 从无形子窗体访问 vba sink (catch) keydown 事件
【发布时间】:2018-01-06 04:02:42
【问题描述】:

我正在开发一个访问程序,用于维护其他应用程序的测试数据。它是一个通用程序,不适用于特定应用程序。假设测试数据存储在数据库表中。因为我的程序事先不知道哪些表是要声明的应用程序的一部分,所以它从应用程序数据库中读取元数据并为每个表创建链接表。 为了输入和维护数据,我有一个带有子表单控件的表单。此子窗体控件没有预定义的源对象。通过将源对象属性设置为“table.[linkedtablename]”,子表单可用于数据输入。当用户从列表中选择另一个应用程序表时,该另一个表将分配给子表单。 这工作得很好。 现在我需要处理来自这个子表单的事件。因为子表单源对象不是表单,所以这并不明显。当子窗体的事件没有参数时,捕获它们是没有问题的。可以编写如下代码:

Me.subformname.form.oncurrent = "=customoncurrent()"

但是如何捕捉 keydown 事件呢?使用 2 个参数(键码、移位)引发此事件。

我不会写:

Me.subformname.form.onkeydown = "=customkeydown()"

在运行时,VBA 将引发事件过程声明中缺少参数的错误。

我曾尝试使用“withevents”子句,但没有成功。可能我对这个子句的可能性知之甚少。

这个问题能解决吗?如何解决?

标记

【问题讨论】:

  • 试图复制情况。我没有收到运行时错误。但是,无论子窗体容器是否绑定到窗体或表,都不会触发 OnKeyDown 事件。什么是“withevents”子句?

标签: vba ms-access


【解决方案1】:

这里有一个不错的简约解决方案。但是,由于您添加了捕获子表单事件的要求,它变得过于简约!

您可以采取多种方式,但我建议这样做:

  • 构建一个通用子表单,设置为以数据表模式显示
  • 将您的事件处理显式添加到子表单的类模块中
  • 在其中放置一堆具有通用名称的文本框,例如 Field01、Field02 等。该数字应超过最大表格中的最大列数
  • 当您链接到新表时,您的代码会将表字段名称放在文本框 ControlSource 属性中,在关联标签中设置标题,并根据需要设置其他属性
  • 最后,编写代码来隐藏未使用的文本框

这可能比其他方法的工作量少..

顺便说一句,不要在表单类模块中使用 WithEvents。那就是自找麻烦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 2011-07-23
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    相关资源
    最近更新 更多