访问不触发自定义事件

Access not firing custom event

我一直在使用 RubberDuck's answer to Best way to test a MS Access Application? 为我的 Access 数据库构建可测试的 MVC 逻辑,但我受困于自定义事件处理。我不明白为什么 OnCreate 事件没有触发。

Form_CreateStudents:

Option Compare Database
    Private ctrl As ctrCreateStudent
    Public Event OnCreate()

    Private Sub btnCreate_Click()
        Set ctrl = New ctrCreateStudent
        ctrl.Run
        RaiseEvent OnCreate
    End Sub

Class 模块 ctrCreateStudent:

Private WithEvents frm As [Form_Create Students]

Public Sub Run()
    MsgBox "run called"
    Set frm = New [Form_Create Students]
End Sub

Public Sub frm_OnCreate()
    MsgBox "frm_oncreate event called"
End Sub

Run 被调用,但 frm_OnCreate 被忽略。我对 VBA 比较陌生,我在这里缺少什么?

很简单:

frmNew [Form_Create Students],而不是调用它的人。

这个新表单不会引发 OnCreate 事件。事实上,这个新表格甚至是不可见的,因为你还没有设置 frm.Visible = True

如果要设置成刚才调用Run的形式,传:

在表格上:

Private ctrl As ctrCreateStudent
Public Event OnCreate()

Private Sub btnCreate_Click()
    Set ctrl = New ctrCreateStudent
    ctrl.Run Me
    RaiseEvent OnCreate
End Sub

在 class:

Private WithEvents frm As [Form_Create Students]

Public Sub Run(parentForm As [Form_Create Students])
    MsgBox "run called"
    Set frm = parentForm 
End Sub

Public Sub frm_OnCreate()
    MsgBox "frm_oncreate event called"
End Sub

强烈警告,但:此代码包含引用循环,因此存在内存泄漏。

表单引用了 class,class 引用了表单,因此两者都不会被销毁。每次关闭和打开表单时,都会创建一个新表单和 class 个对象,其中 none 个对象将被销毁。

关闭表单时,它变得不可见,看起来消失了,但它仍然存在并占用内存。

有很多方法可以解决这个问题,但一个简单的方法是:

在class中:

Public Sub frm_Close()
    Set frm = Nothing 'Release form object, break reference loop
End Sub

并确保表单的 On Close 属性 设置为 "[Event Procedure]" 以便引发关闭事件。