Вопрос

Еще один вопрос от меня о зарегистрированном компоненте TFrame IDE.Спасибо за всю помощь, коллеги-программисты.:)

Играем с предложением Дарриана о наследовании TFrame здесь:

Специфика:

По сути, у меня есть компонент на основе TFrame, который я зарегистрировал в IDE, и он прекрасно работал.Сейчас я разрабатываю несколько "родственных" компонентов, которые будут использовать большую часть невизуальной функциональности и свойств существующего компонента.Тогда имеет смысл перенести большую часть этого в родительский / суперкласс, от которого затем могут наследоваться как новые, так и старые компоненты.

Каков наилучший способ "рефакторинга" наследования TFrame таким образом?(Это может относиться и к потомкам класса TForm, не уверен).Каковы предостережения и на что следует обратить внимание?

Пример:

Я попытался, например, создать новый TFrame, в котором ничего нет, и вызвать этот фрейм TMyBaseFrame.Затем изменил определение класса моего существующего компонента (назовем его TMyFrameTreeView), чтобы наследовать от него, а не от TFrame.

Он скомпилировался нормально, но когда я попытался перенести его в форму, я получил "clientHeight not found" (или "Свойство clientHeight не найдено"), и оно не отображалось в форме.Удаление clientHeight и clientWidth из связанного DFM привело к хаосу, и в любом случае они были заменены при изменении размера.Я заметил explicitHeight и explicitWidth в классах-потомках, и я думаю, что это относится к переопределению значений свойств из унаследованных значений, но я не уверен.Воссоздание совершенно нового фрейма с помощью New -> Inherited Items, а затем копирование всего заново тоже пока не дало отличных результатов.

Заключительная нота

Я понимаю, что это может быстро запутаться из-за потоковой передачи файлов DFM, нескольких поколений потомков и т.д....это часть того, почему я прошу рассказать об общем концептуальном аспекте "на что следует обратить внимание", но также о конкретном реальном мире проще также версия проблемы (которая, как мне кажется, должна быть выполнима).

Я создал небольшой тестовый пакет для взлома в попытках обучения, и я многому учусь, но это происходит медленно, и любое руководство / понимание от вас, "Мастеров-джедаев" Delphi, было бы очень ценно.:)



Ответ обновится позже:

Оба приведенных ниже ответа были полезными.Кроме того, создается "Базовый класс фрейма", который НЕ имеет изменений по сравнению с обычным TFrame, а ЗАТЕМ наследуется от него перед добавлением каких-либо свойств, методов и т.д.кажется, это значительно стабилизирует поток наследования.Не знаю почему, но до сих пор так и было.

Это было полезно?

Решение

В дополнение к изменению базового класса TMyFrameTreeView Для TMyBaseFrame измените первое слово в файле dfm на TMyFrameTreeView От object Для inherited.

Другие советы

Сейчас я разрабатываю несколько "родственных" компонентов, которые будут во многом схожи с существующими компонентами невизуальной функциональности и свойств.Тогда имеет смысл перенести большую часть этого в родительский / суперкласс, от которого затем могут наследоваться как новые , так и старые компоненты.

Каков наилучший способ "рефакторинга" Наследования TFrame таким образом?

Возможно, суть вашего приведенного выше текста заключается в том, что "компонент невизуальный функциональность".Итак, в данном случае, ИМХО, лучше всего разделить визуальный и невизуальный слои.

Так что, возможно, лучше использовать декоратор:

TMySharedEngine = class(Whatever)
property LinkedFrame: TFrame;
property P1;
property P2;
...
procedure Proc1;
procedure Proc2;
... //etc.
end;

и в ваших "сестринских" фреймах использовать его экземпляры:

var
TMyFrame1 = class(TFrame)
...
FDecorator: TMySharedEngine;
  ...
  public
  property MySharedPart: TMySharedEngine read FDecorator;
  constructor Create(AOwner: TComponent); override;
  ...
end;

constructor TMyFrame1.(AOwner: TComponent); override;
begin
  inherited;
  FDecorator:=TMySharedEngine.Create; //ok, ok do not forget to Free it .Destroy
  FDecorator.LinkedFrame:=Self;
  ...
end;

OTOH, если вы хотите использовать свой подход, вы можете использовать визуальное наследование форм (как предложил Дариан) или (более гибко) вы можете сделать это вручную:Создайте с помощью IDE следующие фреймы:TBaseFrame, TChildFrame1, TChildFrame2...и т.д.Теперь перейдите к модулю TChildFrame1 и вручную измените его определение класса с TChildFrame1 = class(TFrame) на TChildFrame1 = class(TBaseFrame).Скомпилировать.Это должно сработать.Рекомендуется, однако, чтобы при выполнении этого трюка TBaseFrame был пустым, чтобы избежать возможных небольших проблем (столкновений функций и т.д.)

ХТХ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top