Связывание элементов управления формы с классом - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь связать элементы управления в форме, которую я создал в модуле класса, и у меня возникают проблемы с его правильной работой.

'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

В отдельной форме я создаю объект и вызываю showForm в событии click

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

Но ничего не происходит, когда я нажимаю кнопку, созданную в CustForm Я пытался использовать временную CommandButton в showForm и после docmd.runcommand acCmdFormView

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 голосов
/ 24 января 2019

Как можно прочитать в документации свойства 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 и очистить его, когда это произойдет.

...