MS Access:在自定义类中实例化表单

问题描述 投票:0回答:2

我正在尝试从自定义类模块(clsMBox)中实例化项目中的现有表单(frmVisibleForm)并从那里操作其属性。我希望能够使用表单中的事件。

我期望发生什么:

  1. Form frmVisibleForm 已实例化但不可见
  2. 表单设置为模态
  3. 表单设置为可见
  4. 表单获得焦点

发生了什么:

什么也没有。运行测试模块的功能时,没有显示任何表单,没有错误消息,没有提示,什么也没有发生。这是我第一次在访问中尝试自定义类,所以也许我犯了一些基本错误,但我不明白为什么它不能按照我想象的方式工作。感谢任何帮助。

这是我到目前为止的代码:

表格(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
vba forms class ms-access
2个回答
0
投票

我想你需要创建

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

0
投票

回复有点晚了,但还是。

第一个困难是在 ClassTest() 中,mbox 是本地的,并且在程序运行后超出范围。 这是指向类实例的唯一指针,因此 IUnknown 随后会销毁该对象。

解决方案是将指针持久保存在模块级对象变量中,形式为全局对象变量(不寒而栗),或者如果您期望有多个实例,则可能保存在全局集合中。

第二个困难是,在类中,InstantiateForm() 不会自行运行,而且它是私有的,因此无法从其他地方调用它。 一种解决方案是将其公开并外部调用。

或者,正如其他人所建议的,将代码放入 Class_Initialize() 中,该类在实例化类时运行,但使用 Private 模块级表单变量而不是静态局部表单变量,并在 Class_Terminate() 中清除它,以允许要关闭的表格。

此外,如果私有类表单变量声明为WithEvents,它可以接收Form.Close事件以清除指向该类的指针。 请注意,此指针必须是全局的,或者如果由表单维护,则必须声明为 Public 才能正常工作。 无论如何,必须在某个地方清除该指针,否则该类将持续存在,我发现这是最可靠的方法。

© www.soinside.com 2019 - 2024. All rights reserved.