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?

Exemplo:

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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top