我试图在我在类模块中创建的表单上链接控件,但无法使其正常工作。
'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.runcommand 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。 但是我最终必须能够构建一个表单工厂类,该类工厂类允许我动态地为类对象构建表单并处理该对象类中的事件。我宁愿不为每个类制作一堆专门构建的表格,而让该表格实例化该类。我想反过来做。类构建表单。
可以做到吗?
答案 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
事件并在事件发生时进行清理。