【问题标题】:Access: Events in Parent Form访问:父表单中的事件
【发布时间】:2013-08-11 15:26:19
【问题描述】:

我仍在摆弄 MS Access,这让我发疯。我当前的问题如下:我将记录导航栏重新创建为子窗体并将其添加到我的主窗体中。此代码用于子表单中

...
Private WithEvents frmParent As Access.Form
...

Private Sub Form_Load()
   ...
   Set frmParent = Me.Parent
   frmParent.OnCurrent = "[Event Procedure]"
   frmParent.Recordset.MoveLast
   frmParent.Recordset.MoveFirst
   ...
End Sub

Private Sub frmParent_Current()
   If frmParent.CurrentRecord = frmParent.Recordset.Count Then
       Me.butNext.Enabled = False
   Else
       Me.butNext.Enabled = True
   End If
   If frmParent.CurrentRecord = 1 Then
       Me.butPrevious.Enabled = False
   Else
       Me.butPrevious.Enabled = True
   End If
End Sub
...
Other MainForm Events...

由此产生了一些问题。首先: MainForm 中的任何事件都不会触发。第二:有时(尤其是在错误之后)vba 会丢失对主窗体的引用。我可以将 Win32 API 解决方法与 CopyMemory 一起使用,但这似乎有点过头了。

我一如既往地感谢您的帮助。

非常感谢

乔恩

【问题讨论】:

  • 当您说事件不会触发时,您是指仅在父表单中吗?甚至在子表单中?如果它只是在父表单中,我并不感到惊讶,因为您正在捕获子表单中的所有事件。
  • 我不得不问你为什么决定把这些导航按钮放在一个子表单中?如果您将它们直接放在表单上,​​您的生活会更简单,也许使用 Rectangle 将它们分组(视觉上)。
  • 因为我有很多表格,我希望有相同的行为并查看所有表格,所以我决定这样做。 @EMett:只有主窗体中的事件,子窗体按预期工作。
  • 我认为,就像我在之前的评论中所写的那样,事件不是广播的,而是被触发到连接到它们的代码,在这种情况下是子表单。因此主窗体没有收到它们。

标签: vba ms-access


【解决方案1】:

实际上这似乎是 Access 中的一个错误...只需为有问题的父表单创建一个代码文件,即使它保持为空并且一切正常。

编辑:我必须纠正自己。这是预期的行为。摘自 Litwin 等人:Access 2002 Desktop Developer's handbook, p. 508

...如果您使用 WithEvents 变量来响应表单的事件,则表单必须具有关联的模块。也就是说,如果 HasModule 属性为 False,Access 不会为表单引发事件,因此任何希望对表单事件做出反应的表单外代码都不会被 Access 调用。

【讨论】:

  • 有趣。通过代码文件,我猜你的意思是一个模块。事实上,我可以想象,如果表单的 HasModule 属性设置为 No,则不需要触发事件。看起来更像是一个功能而不是一个错误 ;-) 感谢分享!
猜你喜欢
  • 2014-09-19
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 2015-01-04
  • 2018-05-15
相关资源
最近更新 更多