Comprensione proprietario vs. Genitore nelle applicazioni Delphi

Ogni volta che si posiziona un pannello su un modulo e un pulsante su quel pannello si crea una connessione "invisibile". La forma diventa la proprietario del pulsante e il pannello è impostato per essere suo genitore.

Ogni componente di Delphi ha una proprietà Owner. Il proprietario si prende cura di liberazione i componenti di proprietà quando vengono liberati.

Simile, ma diversa, la proprietà Parent indica il componente che contiene il componente "figlio".

Genitore

Parent si riferisce al componente in cui è contenuto un altro componente, ad esempio TForm, TGroupBox o TPanel. Se un controllo (padre) ne contiene altri, il controlli contenuti sono controlli figlio del genitore.

Parent determina come viene visualizzato il componente. Ad esempio, le proprietà Sinistra e Superiore sono tutte relative al Genitore.

La proprietà Parent può essere assegnata e modificata durante il runtime.

Non tutti i componenti hanno il genitore. Molte forme non hanno un genitore. Ad esempio, i moduli che appaiono direttamente sul desktop di Windows hanno Parent impostato su zero. Un componente

instagram viewer
hasParent Il metodo restituisce un valore booleano che indica se al componente è stato assegnato o meno un genitore.

Usiamo la proprietà Parent per ottenere o impostare il parent di un controllo. Ad esempio, posizionare due pannelli (Panel1, Panel2) su un modulo e posizionare un pulsante (Button1) sul primo pannello (Panel1). Ciò imposta la proprietà Parent di Button su Panel1.

 Button1.Parent: = Panel2; 

Se si inserisce il codice sopra nell'evento OnClick per il secondo pannello, quando si fa clic su Pannello2 il pulsante "salta" da Pannello1 a Pannello2: Pannello1 non è più il genitore del pulsante.

Quando si desidera creare un pulsante TB in fase di esecuzione, è importante ricordare di assegnare un genitore: il controllo che contiene il pulsante. Perché un componente sia visibile, esso deve avere un genitore per mostrarsi all'interno.

ParentThis e ParentThat

Se selezioni un pulsante in fase di progettazione e controlli la finestra di ispezione degli oggetti, noterai diverse proprietà "Consapevoli dei genitori". Il ParentFont, ad esempio, indica se il carattere utilizzato per la didascalia del pulsante è uguale a quello utilizzato per il genitore del pulsante (nell'esempio precedente: Pannello1). Se ParentFont è True per tutti i pulsanti di un pannello, la modifica della proprietà Carattere del pannello in grassetto fa sì che tutte le didascalie del pulsante sul pannello utilizzino quel carattere (grassetto).

Proprietà dei controlli

Tutti i componenti che condividono lo stesso genitore sono disponibili come parte di controlli proprietà di quel genitore. Ad esempio, è possibile utilizzare i controlli iterare su tutti i figli del controllo con finestre.

Il prossimo pezzo di codice può essere usato per nascondere tutti i componenti contenuti su Panel1:

per ii: = 0 per Panel1.ControlCount - 1 fare

 Panel1.Controls [ii] .Visible: = false;


Trucchi

I controlli con finestre hanno tre caratteristiche di base: possono ricevere il focus di input, usare risorse di sistema e possono essere genitori di altri controlli.

Ad esempio, il componente Button è un controllo con finestra e non può essere il genitore di qualche altro componente - non è possibile posizionare un altro componente su di esso. Il fatto è che Delphi ci nasconde questa caratteristica. Un esempio è la possibilità nascosta per un TStatusBar di avere alcuni componenti come TProgressBar su di esso.

Proprietà

Innanzitutto, si noti che un modulo è il proprietario generale di tutti i componenti che risiedono su di esso (posizionato sul modulo in fase di progettazione). Ciò significa che quando un modulo viene distrutto, vengono distrutti anche tutti i componenti del modulo. Ad esempio, se abbiamo un'applicazione con più di un modulo quando chiamiamo il metodo Free o Release per un oggetto modulo, noi non devi preoccuparti di liberare esplicitamente tutti gli oggetti in quel modulo, perché il modulo è il proprietario di tutti i suoi componenti.

Ogni componente che creiamo, in fase di progettazione o di runtime, deve essere di proprietà di un altro componente. Il proprietario di un componente - il valore della sua proprietà Owner - è determinato da un parametro passato al costruttore Create quando viene creato il componente. L'unico altro modo per riassegnare il proprietario è utilizzare i metodi InsertComponent / RemoveComponent durante il runtime. Per impostazione predefinita, un modulo possiede tutti i componenti su di esso ed è a sua volta di proprietà dell'Applicazione.

Quando usiamo la parola chiave Se stesso come parametro per il metodo Create — l'oggetto che stiamo creando appartiene alla classe in cui è contenuto il metodo — che di solito è un modulo Delphi.

Se d'altra parte, rendiamo un altro componente (non il modulo) il proprietario del componente, allora stiamo rendendo quel componente responsabile dello smaltimento dell'oggetto quando viene distrutto.

Come qualsiasi altro Componente Delphi, Il componente TFindFile personalizzato può essere creato, utilizzato e distrutto in fase di esecuzione. Per creare, utilizzare e liberare a Componente TFindFile in fase di esecuzione, puoi utilizzare il frammento di codice successivo:

usi FindFile;

...
var FFile: TFindFile;

procedura TForm1.InitializeData;

inizio // form ("Self") è il proprietario del componente // non esiste un genitore poiché questo // è un componente invisibile.

 File: = Trova file. Crea (Sé);

 ...

fine;

Nota: poiché il FFile viene creato con un proprietario (Form1), non è necessario fare nulla per liberare il componente: verrà liberato quando il proprietario viene distrutto.

Proprietà dei componenti

Tutti i componenti che condividono lo stesso proprietario sono disponibili come parte di Proprietà dei componenti di quel proprietario. La seguente procedura viene utilizzata per cancellare tutti i componenti Modifica presenti nel modulo:

procedura ClearEdits (AForm: TForm);

var

 ii: intero;

inizio

per ii: = 0 per Un modulo. ComponentCount-1 fare

Se (Un modulo. Componenti [ii] è TEdit) poi TEdit (AForm. Componenti [ii]) Testo: = '';

fine; 

"orfani"

Alcuni controlli (come i controlli ActiveX) sono contenuti in finestre non VCL anziché in un controllo padre. Per questi controlli, il valore di Parent è zero e il ParentWindow la proprietà specifica la finestra padre non VCL. L'impostazione ParentWindow sposta il controllo in modo che sia contenuto nella finestra specificata. ParentWindow viene impostato automaticamente quando viene creato un controllo mediante CreateParented metodo.

La verità è che nella maggior parte dei casi non è necessario preoccuparsi dei genitori e dei proprietari, ma quando si tratta di OOP e sviluppo di componenti o quando vuoi fare un passo avanti in Delphi, le dichiarazioni in questo articolo ti aiuteranno a fare quel passo più velocemente.

instagram story viewer