Înțelegerea proprietarului vs. Părinte în aplicațiile Delphi

De fiecare dată când plasați un panou pe un formular și un buton pe acel panou, faceți o conexiune „invizibilă”. Forma devine proprietar din buton, iar panoul este setat să fie al său mamă.

Fiecare componentă Delphi are o proprietate Owner. Proprietarul are grijă eliberatoare componentele deținute atunci când este eliberat.

Similar, dar diferit, proprietatea Părinte indică componenta care conține componenta "copil".

Mamă

Părintele se referă la componenta în care este conținută o altă componentă, cum ar fi TForm, TGroupBox sau un TPanel. Dacă un control (părinte) conține altele, controale conținute sunt controale ale copilului asupra părintelui.

Părintele stabilește modul în care este afișată componenta. De exemplu, proprietățile Stânga și Sus sunt toate în raport cu părintele.

Proprietatea părintească poate fi atribuită și modificată în timpul rulării.

Nu toate componentele au părintele. Multe forme nu au un Părinte. De exemplu, formularele care apar direct pe desktopul Windows au Parent setat pe nul. A unei componente

instagram viewer
HasParent metoda returnează o valoare booleană care indică dacă componenta a fost atribuită sau nu unui părinte.

Folosim proprietatea Părinte pentru a obține sau seta părintele unui control. De exemplu, așezați două panouri (Panel1, Panel2) pe o formă și așezați un buton (Button1) pe primul panou (Panel1). Aceasta setează proprietatea Butonului părinte pe Panel1.

 Button1.Parent: = Panel2; 

Dacă introduceți codul de mai sus în evenimentul OnClick pentru cel de-al doilea panou, atunci când faceți clic pe Panel2, butonul „sare” de la Panel1 la Panel2: Panel1 nu mai este părintele pentru buton.

Când doriți să creați un TButton în timpul rulării, este important să ne amintim să atribuim un părinte - controlul care conține butonul. Pentru ca o componentă să fie vizibilă, aceasta trebuie să aibă un părinte care să se afișeze în interior.

ParentThis and ParentThat

Dacă selectați un buton la momentul proiectării și priviți inspectorul de obiecte, veți observa mai multe proprietăți „conștiente de părinți”. ParentFont, de exemplu, indică dacă fontul folosit pentru titlul butonului este același cu cel folosit pentru părintele butonului (în exemplul precedent: Panel1). Dacă ParentFont este adevărat pentru toate butoanele de pe un panou, schimbarea proprietății Font a panoului cu caractere îngroșate determină ca toate titlurile butonului de pe panou să folosească acel font (bold).

Controlează proprietatea

Toate componentele care au același părinte sunt disponibile ca parte a Controale proprietatea părintelui respectiv. De exemplu, se pot utiliza Controls pentru iterați peste toți copiii controlului ferestre.

Următoarea bucată de cod poate fi folosită pentru a ascunde toate componentele conținute pe Panel1:

pentru ii: = 0 la Panel1.ControlCount - 1 do

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


Tricking Tricks

Controalele geamuri au trei caracteristici de bază: pot primi focusul de intrare, folosesc resursele sistemului și pot fi părinți la alte controale.

De exemplu, componenta Button este un control fereastră și nu poate fi părinte pentru o altă componentă - nu puteți să o plasați o altă componentă. Chestia este că Delphi ascunde această caracteristică de noi. Un exemplu este posibilitatea ascunsă pentru un TStatusBar de a avea unele componente precum TProgressBar pe el.

Proprietate

În primul rând, rețineți că un formular este proprietarul general al oricărei componente care se află pe acesta (poziționat pe formular la momentul proiectării). Aceasta înseamnă că atunci când o formă este distrusă, toate componentele de pe formular sunt de asemenea distruse. De exemplu, dacă avem o aplicație cu mai multe forme, atunci când apelăm la metoda Free sau Release pentru un obiect de formular, noi nu trebuie să vă faceți griji cu privire la eliberarea explicită a tuturor obiectelor de pe acea formă - deoarece forma este proprietarul a toate componente.

Fiecare componentă pe care o creăm, la proiectare sau timp de execuție, trebuie să fie deținută de o altă componentă. Proprietarul unei componente - valoarea proprietății sale Owner - este determinat de un parametru trecut la Creatorul constructor atunci când componenta este creată. Singura altă modalitate de a reasigna proprietarul este folosirea metodelor InsertComponent / RemoveComponent în timpul rulării. În mod implicit, un formular deține toate componentele de pe acesta și este la rândul său deținut de Aplicație.

Când folosim cuvântul cheie De sine ca parametru pentru metoda Create - obiectul pe care îl creăm este deținut de clasa în care este conținută metoda - care este de obicei o formă Delphi.

Dacă pe de altă parte, facem o altă componentă (nu forma) proprietarul componentei, atunci facem acea componentă responsabilă pentru eliminarea obiectului atunci când este distrusă.

Ca orice altul Componenta Delphi, Componenta personalizată TFindFile poate fi creată, utilizată și distrusă în timpul rulării. Pentru a crea, utiliza și elibera un Componenta TFindFile la rulare, puteți utiliza următorul fragment de cod:

utilizări Gaseste fisier;

...
var FFile: TFindFile;

procedură TForm1.InitializeData;

începe // forma („Sinele”) este Proprietarul componentei // nu există Părinte, deoarece acest // este o componentă de nevăzut.

 FFile: = TFindFile. Creați (Sinele);

 ...

Sfârșit;

Notă: Deoarece fișierul este creat cu un proprietar (Form1), nu trebuie să facem nimic pentru a elibera componenta - va fi eliberat atunci când proprietarul este distrus.

Componente Proprietate

Toate componentele care distribuie același proprietar sunt disponibile ca parte a Proprietatea componentelor a acelui proprietar. Următoarea procedură este folosită pentru a șterge toate componentele de editare care sunt pe formular:

procedură ClearEdits (AForm: TForm);

var

 ii: Integer;

începe

pentru ii: = 0 la O forma. ComponentCount-1 do

dacă (O forma. Componente [ii] este tEditează) apoi TEdit (AForm. Componente [ii]). Text: = '';

Sfârșit; 

„Orfanii“

Unele controale (cum ar fi controalele ActiveX) sunt conținute în ferestrele non-VCL și nu într-un control părinte. Pentru aceste controale, valoarea părintelui este zero si ParentWindow proprietatea specifică fereastra părinte non-VCL. Setarea ParentWindow mută controlul astfel încât acesta să fie conținut în fereastra specificată. ParentWindow este setat automat când se creează un control cu ​​ajutorul butonului CreateParented metodă.

Adevărul este că, în majoritatea cazurilor, nu trebuie să te preocupe Părinții și Proprietarii, ci când vine vorba de OOP și dezvoltarea componentelor sau când doriți să faceți Delphi cu un pas înainte declarațiile din acest articol vă vor ajuta să faceți acest pas mai repede.

instagram story viewer