Да, это может быть сделано!
Я сделал именно то, что вы просите в Delphi 2007 и 2009, и могу сказать, что он работает хорошо для обеих версий независимо от уровня обновления. По пути я столкнулся с некоторыми интересными проблемами, но окончательное решение было очень ясным, если я бился головой о стену в течение дня. Подробнее об этом ниже в моем ответе.
Я поместил свой пользовательский фрейм в пакет времени выполнения, на который ссылается пакет моего компонента designtime. Это было необходимо, чтобы разрешить использование фрейма в приложениях, использующих пакеты времени выполнения, а также чтобы этот же фрейм мог использоваться в других пакетах пользовательских компонентов. Пакет designtime также содержал специальный модуль-эксперт для добавления фрейма в галерею Файл -> Новый -> Другие ... -> «Новые элементы» и для создания пользовательского кода модуля по умолчанию. Эта более поздняя часть была в основном полезной для экономии времени кодирования во время фактического использования и была королевской болью, чтобы получить право. Я записал это на график обучения, так как не смог найти полный пример, соответствующий моей ситуации.
Код от времени разработки ДПК:
requires
DesignIDE,
FramePageListD11R,
...
contains
FramePageListPkgReg in 'FramePageListPkgReg.pas',
И из FramePageListPkgReg
implementation
{$R FramePageListIcons.res}
procedure Register;
begin
...
RegisterCustomModule(TBaseDisplayFrame, TCustomModule);
RegisterPackageWizard(TDisplayFrameModuleExpert.Create);
end;
В моей реализации фрейма не было визуальных компонентов на фрейме, так как моей целью было представить виртуальные методы, опубликованные свойства, события и реализовать собственный интерфейс для моей логики динамической обработки фреймов. Вот содержимое файла DFM и часть файла PAS для справки. Пожалуйста, игнорируйте интерфейс IDisplayFrameEvent, так как он не имеет отношения к текущей теме обсуждения.
object BaseDisplayFrame: TBaseDisplayFrame
Left = 0
Top = 0
Width = 500
Height = 300
HorzScrollBar.Smooth = True
HorzScrollBar.Style = ssHotTrack
HorzScrollBar.Tracking = True
VertScrollBar.Smooth = True
VertScrollBar.Style = ssHotTrack
VertScrollBar.Tracking = True
TabOrder = 0
end
TBaseDisplayFrame = class(TFrame, IDisplayFrameEvent)
private
FOnPageShow : TDisplayFrameEvent;
FOnPageHide : TDisplayFrameEvent;
...
published
...
property OnPageShow: TDisplayFrameEvent read FOnPageShow write FOnPageShow;
property OnPageHide: TDisplayFrameEvent read FOnPageHide write FOnPageHide;
end;
Что касается загрузки DFM, мне не нужно было никакого специального кодирования. Я обнаружил, что в Delphi IDE есть ошибка, которая препятствует включению формы в пакет. Я не помню все детали, но проблема была легко решена путем ручного редактирования сгенерированного кода DPK. Вот соответствующая часть ДПК для справки. Я подозреваю, что это ваша главная проблема. Обратите пристальное внимание на часть комментария, так как это важно для включения DFM в пакет.
contains
BaseDisplayFrameModule in 'BaseDisplayFrameModule.pas' {BaseDisplayFrame: TFrame};
Как только все заработает, вы можете как обычно создавать кадры, а затем изменять файл PAS и DFM для наследования от кадров. Как отметил Джамо, не забудьте заменить «объект» на «унаследованный» в первой строке в DFM. Единственное, что я видел, это то, что имя обработчиков событий в унаследованном фрейме не соответствует типичным соглашениям о присвоении имен Delphi, а скорее происходит от базового класса фреймов. Это чисто косметическое средство, и я не нашел время, чтобы выяснить, есть ли какое-то легкое решение.
Удачи!