Вопрос пользователя заключается в следующем: имеется две библиотеки компонентов ("Base" и "Descendant") и приложение "Example". Базовая библиотека и приложение могут находиться в одной группе проектов, но библиотека "Descendant" должна быть в другой, без доступа к исходному коду "Base" и "Example". Цель такого разделения - скрыть исходный код базовой библиотеки и приложения от работников, которые будут работать с "Descendant".
Базовая библиотека содержит форму TFormBase с компонентами и кодом. После сборки получаем бинарные файлы, такие как bpl и dcp.
В библиотеке "Descendant" определена форма TFormDescendant, наследующая TFormBase. При этом в дизайне формы TFormDescendant должна сохраняться внешность TFormBase, но можно добавить дополнительные компоненты.
Однако при попытке открыть TFormDescendant в Delphi IDE возникает ошибка: "Ошибка создания формы: Предок для 'TFormBase' не найден". Это происходит потому, что Delphi не может найти описание формы в дизайне времени, так как Base.bpl содержит только бинарный код.
Вопрос: Как открыть TFormDescendant в дизайне времени без доступа к исходному коду TFormBase?
Подтвержденный ответ:
Для решения проблемы можно создать "стабовый" модуль с исходным кодом формы, который будет содержать только интерфейс и описание в формате .dfm, идентичное оригиналу. Это позволит разработчикам сначала открыть стабовую форму, а затем и форму-потомка.
Альтернативный ответ:
Создать промежуточный класс TFormBaseStub, наследующий TFormBase, в библиотеке "Descendant". Сделать TFormDescendant наследником TFormBaseStub. Файл FormBaseStub.dfm будет являться копией TFormBase.dfm, а класс TFormBaseStub - простым потомком TFormBase с тем же интерфейсом.
Однако, при таком подходе возникает ошибка, так как в TFormDescendant и TFormBaseStub описываются одни и те же компоненты, что приводит к конфликту.
Рекомендуется использовать копию оригинального модуля, содержащего TFormBase, но не добавлять его в проект "Descendant". Таким образом, исходный код формы будет доступен, но не включен в проект.
Также было предложено использовать виртуальную файловую систему для загрузки модуля из ресурсов, но отмечено, что FileIntf.pas устарел и требуется поиск альтернативы.
Пример решения:
Создать копию модуля FormBase.pas и назвать его, например, FormBaseStub.pas.
Удалить из копии все реализации методов, кроме интерфейса и описания в формате .dfm.
Сделать TFormDescendant наследником TFormBaseStub.
Скомпилировать FormBaseStub.pas вместе с Descendant.pas, чтобы получить бинарный файл с описанием формы в дизайне времени.
type
TFormBaseStub = class(TForm)
// Компоненты и код, соответствующие интерфейсу TFormBase
end;
type
TFormDescendant = class(TFormBaseStub)
// Дополнительные компоненты и переопределения методов
end;
Таким образом, разработчики смогут редактировать форму-потомка, имея доступ только к бинарным файлам базовой библиотеки.
Вопрос связан с проблемой визуального наследования форм в среде разработки Delphi XE2, где необходимо редактировать форму-правнука без доступа к исходному коду базовой формы, с целью скрытия исходного кода базовой библиотеки и приложения от определенной
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS