2017-02-05 3 views
1

У меня возникла проблема с запуском любого события из элементов управления, встроенных в модульные классы в VBA Access. Несмотря на много (много!) Разговоров на разных форумах, связанных с этим, я не нашел никого, кто помог бы мне. Насколько я могу судить, я следую всем их советам (в основном, я всегда использую «Access.Control», «Access.Label» и т. Д., Поэтому всегда используется одна и та же библиотека, и ссылка все еще существует на момент, когда должно произойти событие ...), но он все равно не срабатывает! В том же проекте у меня такая же проблема в нескольких классах; Я возьму пример группы меток на форме.Событие управления, которое не срабатывает в модуле класса VBA

Событие нагрузки формы создает первый, большая группа так:

Private Sub Form_Load() 

    ... 

    set mGroups = new CDocTree 
    mGroups.Make Me 

End Sub 

В CDocTree есть три переменные-члены, объявленные как это:

Private WithEvents mVVPlan As CDocGroup 
Private WithEvents mTestPlan As CDocGroup 
Private mFrm As Form_FrmAlphaDocuments 

и способ сделать по существу делает это:

Public Sub Make(frm As Access.Form) 

    Set mFrm = frm 

    With mFrm 

    Set mVVPlan = New CDocGroup 
    mVVPlan .Make .LblVVPlanBox, .LblVVPlanRef 

    Set mTestPlan = New CDocGroup 
    mTestPlan .Make .LblTestPlanBox, .LblTestPlanRef 

    End With 

End Sub 

И наконец, класс CDocGroup определяется следующим образом:

Private WithEvents mBox As Access.Label 
Private WithEvents mRef As Access.Label 

Public Event Clicked(grp As CDocGroup) 

Public Sub Make(box As Access.Label, ref As Access.Label) 

    ... 

    Set mBox = box 
    Set mRef = ref 

End Sub 

Private Sub mBox_Click() 
    Debug.Print "Event Click fired in CDocGroup on " & mBox.Name 
    RaiseEvent Clicked(Me) 
End Sub 

Private Sub mRef_Click() 
    Debug.Print "Event Click fired in CDocGroup on " & mRef.Name 
    RaiseEvent Clicked(Me) 
End Sub 

Вот и все: код никогда не попадает в mBox_Click или mRef_Click. Что я делаю неправильно?

+0

Раньше мне приходилось заглушать эти события в модуле Form, чтобы они проходили к событиям класса (хотя я читал, что вам не нужно это делать). Таким образом, вставьте объявление скелета, Private Sub lblBox_Click() ... End Sub в самой форме и посмотрите, проходит ли она через события. – VBlades

ответ

0

Спасибо VBlades, это трюк.

Несмотря на то, что это необходимо для того, чтобы что-то вроде этого было необходимо, я действительно могу проверить, что если я помещаю объявление для некоторых элементов управления, а не для других, мои события срабатывают только для элементов управления, у которых есть пустое объявление события в модуль формы.

Так быть ясно, в модуле формы, а для каждого элемента управления, что мне нужно реагировать, добавить пустое заявление:

Private Sub LblVVPlanBox_Click() 

End Sub 

Нет кода вообще в нем, но теперь это событие в моем классе выполняется пожар и код в классе. Это отвратительно, но все же лучше, чем копировать в 20 раз те же инструкции в модуле формы.

Смежные вопросы