Perché alcuni componenti di Delphi richiedono & # 8220; AOwner: TComponent & # 8221; Costruirli?

StackOverflow https://stackoverflow.com/questions/474448

  •  19-08-2019
  •  | 
  •  

Domanda

Sembra del tutto irrilevante richiedere a un TComponent come proprietario di creare un'istanza di un oggetto di qualche tipo. Perché ci sono così tanti componenti Delphi che lo richiedono?

Ad esempio, TXMLDocument richiede un'istanza di TComponent per istanziare.

Perché è questo e se c'è una buona ragione, cosa dovrei usare lì dentro per fare la cosa giusta " ;?

È stato utile?

Soluzione

Il componente proprietario dovrebbe gestire tutti i suoi componenti di proprietà. I componenti di proprietà vengono distrutti automaticamente quando il proprietario viene distrutto.

Questo aiuta lo sviluppatore che trascina i componenti dalla tavolozza degli strumenti, li rilascia sul modulo e aggancia semplicemente gli eventi per svolgere il proprio lavoro senza preoccuparsi di gestire la durata dei componenti.

Il modulo è il proprietario di tutti i componenti rilasciati su di esso. L'oggetto Application è il proprietario del modulo. Quando l'app viene chiusa, l'oggetto Applicazione viene distrutto, il che a sua volta distrugge i moduli e tutti i componenti.

Ma il proprietario non è veramente necessario quando viene creato un componente. Se passi Nil al parametro, il componente verrà creato senza un proprietario e in questo caso sarà tua responsabilità gestire la durata del componente.

Altri suggerimenti

Tutti i discendenti di TComponent richiedono Proprietario, è definito nel costruttore TComponent. Il componente Proprietario è responsabile della distruzione di tutti i componenti di proprietà.

se vuoi controllare il tempo di vita, puoi passare zero come parametro.

Solo per aggiungere alcune informazioni extra.

Ogni controllo ha anche un genitore. (A TWinControl). Laddove il proprietario si occupa della vita, il genitore si occupa di mostrare l'oggetto.

Ad esempio un modulo ha un pannello e il pannello ha un pulsante. In tal caso, il modulo possiede il pannello e il pulsante. Ma il modulo è il genitore del pannello e il pannello è il genitore del pulsante.

C'è anche qualcos'altro di cui essere consapevoli. Ho usato più di un paio di componenti di terze parti che si affidano a un componente Proprietario che viene passato in Creazione costruttore, e se passi in zero genererà un'eccezione / AV.

Il risultato netto è che questi componenti funzioneranno bene quando si utilizza visivamente all'interno dell'IDE ma causano problemi quando vengono creati in fase di esecuzione.

La causa di questi problemi è, in un certo senso, cattiva progettazione. Nulla nelle regole afferma che non puoi / non dovresti passare in NIL come parametro aOwner.

L'oggetto non RICHIEDE un componente t deve essere passato come proprietario. Puoi facilmente passare da zero a questo e gestire tu stesso la distruzione. Molto spesso, tendo a utilizzare questa tecnica per routine localizzate in cui il componente utilizzato non verrà utilizzato al di fuori del metodo corrente. ad esempio:

Procedure TForm1.Foo;
var
  XmlDoc : tXmlDocument;
begin
  XmlDoc := tXmlDocument.Create(nil);
  try
    // do processing of the XMLDoc here
  finally
    FreeAndNil(XmlDoc); 
  end;
end;

Dovresti usarlo per due motivi: - il meccanismo di proprietà si pone anche come una sorta di sistema di raccolta dei rifiuti - il meccanismo di proprietà è importante nel processo di serializzazione di Delphi (Stream.ReadComponent / WriteComponent ecc.).

Un parametro Owner è necessario solo per i discendenti TComponent , in quanto è un parametro del costruttore TComponent . Tutti i componenti che sono accessibili in fase di progettazione per essere rilasciati sulle classi TForm , TFrame e TDataModule sono discendenti TComponent (che include TXMLDocument ).

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