访问不触发自定义事件
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 比较陌生,我在这里缺少什么?
很简单:
frm
是 New [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]"
以便引发关闭事件。
我一直在使用 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 比较陌生,我在这里缺少什么?
很简单:
frm
是 New [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]"
以便引发关闭事件。