Как можно прочитать в документации свойства Form.HasModule , существует два вида форм и отчетов: облегченные формы и отчеты, которые не имеют модуля класса и не поддерживают события и полные формы и отчеты, которые имеют модуль класса и события поддержки.
Это означает, что вам все еще нужно переключить это свойство для поддержки событий:
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
изменяет часть проекта VB базы данных Access (он добавляет модуль класса), и, таким образом, каждый раз, когда вы делаете это, ваша база данных должна будет перекомпилироваться. Как правило, вы хотите этого избежать, так как это может привести к проблемам.
Вместо этого я рекомендую иметь одну форму с модулем и всеми элементами управления, которые вы можете захотеть. Затем вы можете перемещаться по элементам управления, изменять их заголовки и изменять их размер, связывать их с полями таблицы и настраивать обработчики событий, и все это без изменения проекта 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
Для получения дополнительной информации о изящной обработке классов со ссылками на формы вы можете посмотреть этот ответ мной. Вам, вероятно, следует прослушать событие Form_Unload
и очистить его, когда это произойдет.