Могу ли я реализовать интерфейс, содержащий общедоступную переменную-член определенной пользовательской формы?

#vba #interface #userform #public #catia

Вопрос:

Я успешно создал пользовательскую форму, которая реализует интерфейс, позволяющий отображать всплывающую подсказку с предупреждением (https://youtu.be/8dvWjXgVpxk ). Он работает просто отлично, когда все пользовательские формы, модули и классы расположены в одном общем проекте, но теперь я хотел бы взять интерфейс и сохранить его в другом проекте, который я мог бы затем повторно использовать во многих разных проектах, создав ссылку на него (Инструменты -> Ссылки).). К сожалению, когда я передаю интерфейс и пользовательскую форму, которые этот интерфейс использует в качестве переменной-члена, я получаю сообщение об ошибке компиляции: «Частные объектные модули не могут использоваться в общедоступных объектных модулях в качестве параметров или возвращаемых типов для общедоступных процедур, в качестве общедоступных элементов данных или в качестве полей общедоступных пользовательских типов.» сообщение об ошибке

Я борюсь с этим уже несколько дней и не могу найти подход propper.

Упрощенная структура кода:

Основной проект:
модуль: UFManager:

 Sub CATMain()
    UFThatHasTooltip.Show
End Sub
 

форма пользователя: UFThatHasTooltip:

 Implements ICanShowTooltip

Private Sub UserForm_Click()
    Debug.Print "click!"
End Sub
 

Внешний проект:

класс / интерфейс: ICanShowTooltip:

 Public myTooltip As UFTooltip
 

форма пользователя: UFTooltip

 'empty
 

Я думаю, что основная проблема вызвана тем фактом, что пользовательская форма UFTooltip считается закрытой и, следовательно, не может быть использована в какой-либо форме ничем, что работает как общедоступное. Я знаю, как решить эту проблему, когда вместо пользовательской формы я хотел бы использовать класс в качестве переменной-члена интерфейса (изменив свойство ‘Instancing’ класса с ‘1 — Private’ на ‘2 — PublicNotCreatable’), но я не могу найти свойство пользователяформа, которая изменяет свое поведение на «Общедоступное».

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

РЕДАКТИРОВАТЬ: мне удалось экспортировать .frm-файл UFTooltip, отредактировать атрибут VB_Exposed и установить его значение в True . Это помогло с первоначальной проблемой, поэтому я доработал код и разместил его в репозитории: https://github.com/hwnd-git/VBA-Interface-Sandbox Теперь я хотел бы знать, есть ли способ добиться этого без необходимости экспорта пользовательской формы и редактирования ее файла .frm.

Комментарии:

1. Вам нужна фабрика, которую можно использовать для создания объекта формы. Если вы опубликуете код своей формы, мы можем показать вам, как это сделать.

2. @VictorK: Это сработало! Теперь — есть ли способ добиться того же эффекта без необходимости экспорта пользовательской формы и редактирования файла, чтобы сделать его общедоступным?

3. @freeflow Я дополнительно обновил код, учитывая советы acount Victor. Не могли бы вы проверить модуль FactoryTooltip, пожалуйста? Вы ссылаетесь на factory как на метод / класс, который имеет возможность создавать экземпляр пользовательской формы? Как его использовать, если я проигнорировал совет Виктора и не редактировал .frm-файл UFTooltip? Я добавил файлы в репозиторий, чтобы вы могли получить к ним доступ: github.com/hwnd-git/VBA-Interface-Sandbox