#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