我正在尝试从自定义类模块(clsMBox)中实例化项目中的现有表单(frmVisibleForm)并从那里操作其属性。我希望能够使用表单中的事件。
我期望发生什么:
发生了什么:
什么也没有。运行测试模块的功能时,没有显示任何表单,没有错误消息,没有提示,什么也没有发生。这是我第一次在访问中尝试自定义类,所以也许我犯了一些基本错误,但我不明白为什么它不能按照我想象的方式工作。感谢任何帮助。
这是我到目前为止的代码:
表格(frmVisibleForm):
Option Compare Database
Option Explicit
Public Event DataInput(InputValue As String)
(目前还没有实际事件)
自定义类模块(clsMBox):
Option Compare Database
Option Explicit
Dim WithEvents cls_frmVisibleForm As Form_frmVisibleForm
Private Sub InstantiateForm()
Set cls_frmVisibleForm = New Form_frmVisibleForm
With cls_frmVisibleForm
.Modal = True
.Visible = True
.SetFocus
End With
End Sub
我尝试从(mdlTestMBox)测试它的模块:
Option Compare Database
Option Explicit
Public Function ClassTest()
Dim mbox As clsMBox
Set mbox = New clsMBox
End Function
我想你需要创建
InstantiateForm
一个 public 方法,然后调用它,或者将其重命名为初始化:
Private Sub Class_Initialize()
Static cls_frmVisibleForm As Access.Form
Set cls_frmVisibleForm = New Form_frmVisibleForm
With cls_frmVisibleForm
.Modal = True
.Visible = True
.Move 0, 0
End With
End Sub
打开和关闭表单的实例:
Public Function ClassTest()
Static mbox As clsMBox
Set mbox = New clsMBox
Stop
DoCmd.Close acForm, Forms(0).Name
End Function
回复有点晚了,但还是。
第一个困难是在 ClassTest() 中,mbox 是本地的,并且在程序运行后超出范围。 这是指向类实例的唯一指针,因此 IUnknown 随后会销毁该对象。
解决方案是将指针持久保存在模块级对象变量中,形式为全局对象变量(不寒而栗),或者如果您期望有多个实例,则可能保存在全局集合中。
第二个困难是,在类中,InstantiateForm() 不会自行运行,而且它是私有的,因此无法从其他地方调用它。 一种解决方案是将其公开并外部调用。
或者,正如其他人所建议的,将代码放入 Class_Initialize() 中,该类在实例化类时运行,但使用 Private 模块级表单变量而不是静态局部表单变量,并在 Class_Terminate() 中清除它,以允许要关闭的表格。
此外,如果私有类表单变量声明为WithEvents,它可以接收Form.Close事件以清除指向该类的指针。 请注意,此指针必须是全局的,或者如果由表单维护,则必须声明为 Public 才能正常工作。 无论如何,必须在某个地方清除该指针,否则该类将持续存在,我发现这是最可靠的方法。