Ms从无形子窗体访问vba sink(catch)keydown事件

时间:2017-07-09 15:55:53

标签: vba ms-access

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

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

但如何抓住一个keydown事件?此事件引发了2个参数(键代码,移位)。

我不能写:

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

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

我曾试图使用'withevents'条款,但没有成功。也许我对这一条款的可能性知之甚少。

这个问题可以解决吗?

标记

1 个答案:

答案 0 :(得分:0)

你有一个很好的,简约的解决方案。但是,既然你添加了捕获子表单事件的要求,它就变得太简约了!

你可以采取多种方式,但我会建议:

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

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

BTW不要在表单类模块中使用WithEvents。那只是乞求麻烦。