Domanda

Ancora un'altra mia domanda sul componente registrato IDE TFrame.Grazie per tutto l'aiuto, colleghi programmatori.:)

Giocare con il suggerimento di eredità TFrame di Darrian Qui:

Specifiche:

Fondamentalmente, ho un componente basato su TFrame che ho registrato nell'IDE e ha funzionato meravigliosamente.Attualmente sto sviluppando alcuni componenti "sorelli" che condivideranno gran parte delle funzionalità e delle proprietà non visive del componente esistente.Ha senso, quindi, spostare gran parte di esso in un genitore/superclasse da cui possono ereditare sia i nuovi che i vecchi componenti.

Qual è il modo migliore per "refactoring" l'eredità TFrame in questo modo?(Ciò potrebbe applicarsi anche ai discendenti della classe TForm, non ne sono sicuro).Quali sono gli avvertimenti e le cose a cui prestare attenzione?

Esempio:

Ho provato, ad esempio, a creare un nuovo TFrame, senza nulla sopra, e a chiamare quel frame TMyBaseFrame.Quindi ho modificato la definizione della classe del mio componente esistente (chiamiamolo TMyFrameTreeView) per ereditare da quello anziché da TFrame.

Si è compilato correttamente, ma quando ho provato a inserirlo in un modulo, ho ricevuto "ClientHeight non trovato" (o "Proprietà ClientHeight non trovata") e non veniva inserito nel modulo.L'eliminazione di ClientHeight e ClientWidth dal relativo DFM ha causato il caos e sono stati comunque sostituiti durante il ridimensionamento.Ho notato ExplicitHeight e ExplicitWidth nelle classi discendenti e penso che si riferisca alle sostituzioni del valore della proprietà da valori ereditati, ma non ne sono sicuro.Anche ricreare un frame completamente nuovo tramite Nuovo -> Elementi ereditati e quindi copiare tutto da capo non ha ancora prodotto grandi risultati.

Nota finale

Mi rendo conto che la situazione potrebbe complicarsi rapidamente, con lo streaming di file DFM e più generazioni di discendenti, ecc....che è parte del motivo per cui chiedo l'aspetto concettuale generale delle "cose ​​a cui prestare attenzione", ma fornisco anche uno specifico mondo reale più semplice anche la versione del problema (che mi sembra dovrebbe essere fattibile).

Ho creato un piccolo pacchetto di test per hackerare i tentativi di apprendimento e sto imparando molto, ma è lento e qualsiasi guida/intuizione da parte di voi "Maestri Jedi" di Delphi là fuori sarebbe MOLTO apprezzata.:)



Rispondi all'aggiornamento più tardi:

Entrambe le risposte seguenti sono state utili.Inoltre, creando una "classe frame base" che NON presenta modifiche rispetto al normale TFrame e POI ereditarla prima di aggiungere proprietà, metodi, ecc.sembra stabilizzare enormemente lo streaming dell'eredità.Non so perché, ma finora è successo.

È stato utile?

Soluzione

Oltre a cambiare la classe base di TMyFrameTreeView A TMyBaseFrame cambia la prima parola nel file dfm per TMyFrameTreeView da object A inherited.

Altri suggerimenti

Ora sto sviluppando alcuni componenti "sorella" che condivideranno gran parte della funzionalità e delle proprietà non visive del componente esistente.Ha senso, quindi, spostarsi molto a un genitore/superclasse da cui possono ereditare sia il nuovo che i vecchi componenti.

Qual è il modo migliore per "refactor" l'eredità TFRAME in questo modo?

Il punto cruciale del tuo testo sopra forse è "component's non visivo funzionalità".Quindi, in questo caso, IMHO è meglio separare i livelli visivi e non visivi.

Quindi, forse è meglio usare un decoratore:

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

e nei frame "sorelli" per utilizzarne le istanze:

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 vuoi utilizzare il tuo approccio puoi utilizzare Visual Form Inheritance (come suggerito da Darian) o (più flessibile) puoi farlo a mano:Creare, utilizzando l'IDE, i seguenti frame:TBaseFrame, TChildFrame1, TChildFrame2 ...eccetera.Ora vai sull'unità di TChildFrame1 e modifica manualmente la definizione della classe da TChildFrame1 = class(TFrame) a TChildFrame1 = class(TBaseFrame).Compilare.Dovrebbe funzionare.Si consiglia tuttavia che quando si esegue questo trucco, TBaseFrame sia vuoto per evitare possibili piccole anomalie (collisioni di funzionalità, ecc.)

HTH.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top