将表单控件链接到类

时间:2019-01-24 00:59:43

标签: vba ms-access access-vba

我试图在我在类模块中创建的表单上链接控件,但无法使其正常工作。

'Class Name is CustForm  

Option Explicit

Private WithEvents btnTest as CommandButton

Public Function showForm()  

    Dim tempForm as Form  
    Dim formName as String  
    Set tempForm = CreateForm  
    formName = tempForm.Name  
    Set btnTest = CreateControl(formName, 
    acCommandButton,acDetail,,,300,300,1000,500)
    Dim btnName As String  
    btnName = btnTest.Name  
    Docmd.RunCommand acCmdFormView  

End Function

Private Sub btnTest_Click()
    MsgBox "Test"
End Sub

在单独的表单中,我创建对象并在click事件中调用showForm

Private Sub Command0_Click()
    Dim tstForm as CustForm
    set tstForm= New CustForm
    tstForm.showForm
End Sub

但是当我单击在CustForm中创建的按钮时,什么也没有发生 我尝试在showForm中和docmd.runco​​mmand acCmdFormView

之后使用临时CommandButton。
set btnTest = Forms(formName).Controls(btnName)

假设在窗体进入“窗体视图”时命令按钮的实例可能会更改。再次没有喜悦。

但是,如果我将其添加到CustForm类

Public Function init(lclBtn as CommandButton)
    set btnTest = lclBtn
    btnTest.OnClick = "[Event procedure]"
End Function

然后我删除OnClick并将此代码添加到表单的模块

Option Explicit
Dim tester as CustForm

Private Sub Form_Open(Cancel as Integer)
    Set tester = new CustForm
    tester.init Me.Command0
End Sub

然后,当我单击按钮时,它将触发MsgBox。 但是我最终必须能够构建一个表单工厂类,该类工厂类允许我动态地为类对象构建表单并处理该对象类中的事件。我宁愿不为每个类制作一堆专门构建的表格,而让该表格实例化该类。我想反过来做。类构建表单。

可以做到吗?

1 个答案:

答案 0 :(得分:0)

可以在documentation of the Form.HasModule property中阅读,有两种形式和报告:没有类模块并且不支持事件的轻量级形式和报告,以及具有事件的完整形式和报告。有一个课程模块和支持事件。

这意味着您仍然需要切换此属性以支持事件:

Private WithEvents btnTest as CommandButton

Public Function showForm()  
    Dim tempForm as Form  
    Dim formName as String  
    Set tempForm = CreateForm
    tempForm.HasModule = True
    formName = tempForm.Name  
    Set btnTest = CreateControl(formName, acCommandButton,acDetail,,,300,300,1000,500)
    btnTest.OnClick = "[Event Procedure]"
    Dim btnName As String  
    btnName = btnTest.Name  
    DoCmd.RunCommand acCmdFormView  
End Function

Private Sub btnTest_Click()
    MsgBox "Test"
End Sub

请注意,设置Form.HasModule会修改Access数据库的VB项目部分(它添加了一个类模块),因此,每次执行此操作时,都需要重新编译数据库。通常,您要避免这种情况,因为这可能会导致问题。

相反,我建议使用一个表单,其中包含一个模块以及您可能需要的所有控件。然后,您可以在控件周围移动,更改其标题,调整其大小,将它们绑定到表字段以及设置事件处理程序,而无需修改数据库背后的VB项目(请注意,您无法将控件添加到完整的控件中)。在不修改VB项目的情况下形成或更改控件的名称。

请注意,第二个问题是类对象的持久性。当前,没有对该类的引用,因此已被销毁。您可以使用以下代码轻松地使您的类无限期地持久化:

Private WithEvents btnTest as CommandButton
Private Myself As Object

Public Function showForm()
    Set Myself = Me 'Circular reference, object won't get destroyed until myself is set to nothing

有关通过引用表单优雅地处理类的更多信息,您可以查看我的this answer。您可能应该听Form_Unload事件并在事件发生时进行清理。