Private mErrors() As CError64Row
Ваши объекты «провайдера событий» находятся в этом массиве mErrors
- вам нужно как-то объявить его WithEvents
, но это будет недопустимо:
Private WithEvents mErrors() As CError64Row
Проблема не в том, что объект создается в методе - как он создается, не имеет значения. Проблема в том, что у вас нет возможности заставить форму обрабатывать события, перенаправляемые объектом, ссылка на который находится в массиве / коллекции, а не в поле Private WithEvents
.
Решение состоит в том, чтобы заставить пользовательский класс общаться с формой - и у вас уже есть ссылка на него:
Private Sub lblDescription_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim parentForm As TheFormClass
Set parentForm = lblDescription.Parent
parentForm.HandleErrorClicked(row, col)
End Sub
Теперь, это тесно связывает форму TheFormClass
с классом пользовательского элемента управления, и это не идеально - что если нам нужно повторно использовать этот класс в другой форме?
Мы могли бы пойти с поздним связыванием:
Private Sub lblDescription_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim parentForm As Object
Set parentForm = lblDescription.Parent
parentForm.HandleErrorClicked(row, col)
End Sub
Но тогда мы теряем проверку во время компиляции, и нет никакой гарантии, что у parentForm
есть метод HandleErrorClicked
- а если метода нет, мы взорвемся с ошибкой 438.
Если только ... если мы не формализуем это с помощью интерфейса, например очень простого IErrorView
класса, который может выглядеть следующим образом:
Option Explicit
Public Sub HandleErrorClicked(ByVal row As Long, ByVal col As Long)
End Sub
... и заставить класс формы реализовать этот интерфейс:
Implements IErrorView
Private Sub IErrorView_HandleErrorClicked(ByVal row As Long, ByVal col As Long)
' there's the handler!
End Sub
И теперь пользовательский класс управления может работать с любой формой, которая реализует интерфейс IErrorView
, и мы получаем подтверждение во время компиляции:
Private Sub lblDescription_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim parentForm As IErrorView
Set parentForm = lblDescription.Parent
parentForm.HandleErrorClicked(row, col)
End Sub