TFrame refatoração herança
-
09-09-2019 - |
Pergunta
No entanto, outra questão TFrame IDE registrado componente de mim. Obrigado por toda a ajuda, colegas programadores. :)
Brincando com herança sugestão TFrame de Darrian aqui :
Detalhes:
Basicamente, eu tenho uma componente baseada no TFrame que eu registrado no IDE, e tem funcionado maravilhosamente. Agora eu estou desenvolvendo alguns componentes "irmãs" que compartilham uma grande quantidade de funcionalidade e propriedades não-visual do componente existente. Faz sentido, então, para mover um monte de que para um pai / superclasse que tanto o novo e os componentes antigos podem herdar.
O que é a melhor maneira de "refatorar" herança TFrame desta forma? (Isto pode aplicar aos descendentes TForm classe também, não tenho certeza). Quais são as advertências e as coisas que atente para?
Eu tentei, por exemplo, a criação de um novo TFrame, com nada sobre ele, e chamando esse quadro TMyBaseFrame. Em seguida, modificou a definição de classe do meu componente existente (Vamos chamam TMyFrameTreeView) para herdar de que ao invés de TFrame.
É bem compilado, mas quando eu tentei deixá-la cair em um formulário, eu tenho "ClientHeight não encontrado" (ou "propriedade ClientHeight não encontrado"), e não cairia no formulário. Excluindo ClientHeight e ClientWidth do DFM relacionado causou estragos, e eles acabaram substituído em cima do redimensionamento de qualquer maneira. Notei explicitHeight e explicitWidth nas classes descendentes e estou pensando que se relaciona com sobreposições de propriedades de valor de valores herdados, mas não tenho certeza. Recriando uma estrutura inteiramente nova via Nova -.> Os produtos herdados, e, em seguida, copiar tudo mais, ainda não produziu grandes resultados ainda quer
Nota Final
Eu percebo isso pode ficar confuso rapidamente, com streaming de arquivos DFM e várias gerações de descendentes, etc .... que é parte da razão pela qual eu estou pedindo para os totais "coisas de olhar para fora" aspecto conceitual, mas também dando uma específica real-world simples versão do problema, bem como (que me parece, deve ser factível).
Eu criei um pacote pequeno teste para cortar em torno de tentativas de aprendizagem, e estou aprendendo muito, mas é ir lento, e qualquer orientação / visão de você Delphi "Mestres Jedi" lá fora, seria mais apreciado. :)
Resposta atualização posterior:
Tanto as respostas abaixo foram úteis. Assim, a criação de uma "estrutura de base de classes" que não tem nenhuma muda do TFrame normal, e em seguida, herdada de que antes da adição de quaisquer propriedades, métodos, etc. parece estabilizar a herança de streaming tremendamente. Não sei por que, mas até agora ele tem.
Solução
Além de alterar classe base de TMyFrameTreeView
à mudança TMyBaseFrame
a primeira palavra no arquivo dfm para TMyFrameTreeView
de object
para inherited
.
Outras dicas
Agora estou desenvolvendo alguns "irmã" componentes que irão partilhar uma grande Deal of the de componentes existentes funcionalidade não visual e propriedades. Faz sentido, então, mover um monte de que a um pai / superclasse que tanto o novo e os componentes antigos pode, então, Herdar do.
O que é a melhor maneira de "refatorar" TFrame herança desta forma?
O cerne do seu texto acima, talvez, é "do componente não-visual funcionalidade". Então, neste caso, IMHO é melhor separar as camadas visuais e não-visuais.
Assim, talvez seja melhor usar um decorador:
TMySharedEngine = class(Whatever)
property LinkedFrame: TFrame;
property P1;
property P2;
...
procedure Proc1;
procedure Proc2;
... //etc.
end;
e em seus quadros 'irmã' para casos de uso do mesmo:
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, se você quiser usar a sua abordagem pode utilizar o Visual Form Inheritance (como Darian sugerido) ou (mais flexível), você pode fazer tudo na mão: Criar, usando o IDE os seguintes quadros: TBaseFrame, TChildFrame1, TChildFrame2. .. etc. Agora vá na unidade e mudança de TChildFrame1 à mão-lo de definição de classe de TChildFrame1 = class (TFrame) para TChildFrame1 = class (TBaseFrame). Compilar. Ele deve funcionar. Recomenda-se ainda que, quando você vai fazer isso TBaseFrame truque para estar vazio, a fim de evitar possíveis peculiaridades pequenas (colisões de recursos etc.)
HTH.