Доступ не запускает настраиваемое событие - PullRequest
0 голосов
/ 14 июля 2020

Я создавал тестируемые MVC logi c для моей базы данных Access, используя ответы RubberDuck на Лучший способ протестировать приложение MS Access? но я застрял с настраиваемой обработкой событий. Я не могу понять, почему не запускается событие OnCreate.

Form_CreateStudents:

Option Compare Database
    Private ctrl As ctrCreateStudent
    Public Event OnCreate()

    Private Sub btnCreate_Click()
        Set ctrl = New ctrCreateStudent
        ctrl.Run
        RaiseEvent OnCreate
    End Sub

Модуль класса ctrCreateStudent:

Private WithEvents frm As [Form_Create Students]

Public Sub Run()
    MsgBox "run called"
    Set frm = New [Form_Create Students]
End Sub

Public Sub frm_OnCreate()
    MsgBox "frm_oncreate event called"
End Sub

Run вызывается, но frm_OnCreate просто игнорируется. Я относительно новичок в VBA, чего мне здесь не хватает?

1 Ответ

2 голосов
/ 14 июля 2020

Довольно просто:

frm - это New [Form_Create Students], а не тот, который его вызывает.

Эта новая форма не вызывает OnCreate мероприятие. Фактически, эта новая форма даже не видна, потому что вы не установили frm.Visible = True

. Если вы хотите установить ее в форму, которая только что вызвала Run, передайте ее:

На форме:

Private ctrl As ctrCreateStudent
Public Event OnCreate()

Private Sub btnCreate_Click()
    Set ctrl = New ctrCreateStudent
    ctrl.Run Me
    RaiseEvent OnCreate
End Sub

На классе:

Private WithEvents frm As [Form_Create Students]

Public Sub Run(parentForm As [Form_Create Students])
    MsgBox "run called"
    Set frm = parentForm 
End Sub

Public Sub frm_OnCreate()
    MsgBox "frm_oncreate event called"
End Sub

Однако серьезное предупреждение: этот код содержит ссылку l oop и, следовательно, утечку памяти.

Форма имеет ссылку на класс, а класс имеет ссылку на форму, поэтому ни одна из них никогда не будет уничтожена. Каждый раз, когда вы закрываете и открываете форму, создается новая форма и объект класса, и ни один из них никогда не будет уничтожен.

При закрытии формы она становится невидимой и выглядит исчезнувшей, но все еще там и с использованием памяти.

Есть много способов обойти это, но самый простой:

В классе:

Public Sub frm_Close()
    Set frm = Nothing 'Release form object, break reference loop
End Sub

И убедитесь, что форма При закрытии * Свойство 1034 * установлено в "[Event Procedure]", поэтому возникает событие закрытия.

...