Förstå ägare vs. Förälder i Delphi-applikationer

Varje gång du placerar en panel på ett formulär och en knapp på den panelen skapar du en "osynlig" anslutning. Formen blir ägare på knappen, och panelen är inställd på att vara dess förälder.

Varje Delphi-komponent har en ägareegenskap. Ägaren tar hand om frigör de ägda komponenterna när den frigörs.

Liknande, men annorlunda, föräldraregenskapen indikerar komponenten som innehåller "barn" -komponenten.

Förälder

Förälder hänvisar till den komponent som en annan komponent innehåller, till exempel TForm, TGroupBox eller en TPanel. Om en kontroll (förälder) innehåller andra, kommer innehöll kontroller är barnkontroller av föräldern.

Förälder bestämmer hur komponenten ska visas. Till exempel är vänster- och toppegenskapen alla relativt föräldrarna.

Föräldraregenskapen kan tilldelas och ändras under körning.

Inte alla komponenter har överordnade. Många former har inte förälder. Till exempel har formulär som visas direkt på Windows-skrivbordet förälder inställd på noll. En komponent HasParent metoden returnerar ett booleskt värde som indikerar om komponenten har tilldelats en överordnad eller inte.

instagram viewer

Vi använder föräldraregenskapen för att få eller ställa in överordnade till en kontroll. Lägg till exempel två paneler (Panel1, Panel2) på ett formulär och placera en knapp (Knapp1) på den första panelen (Panel1). Detta sätter Buttons överordnade egenskap till Panel1.

 Knapp1.Parent: = Panel2; 

Om du placerar ovanstående kod i OnClick-händelsen för den andra panelen, när du klickar på Panel2, "hoppar" knappen från Panel1 till Panel2: Panel1 är inte längre föräldrar för knappen.

När du vill skapa en TButton vid körning är det viktigt att vi kommer ihåg att tilldela en förälder - kontrollen som innehåller knappen. För att en komponent ska vara synlig är det måste ha en förälder för att visa sig själv inom.

ParentThis och ParentThat

Om du väljer en knapp vid designtid och tittar på objektinspektören kommer du att märka flera "föräldersmedvetna" egenskaper. De ParentFont, till exempel, anger om teckensnittet som används för knappens bildtexter är detsamma som det som används för knappens överordnade (i föregående exempel: Panel1). Om ParentFont är sant för alla knappar på en panel, ändrar panelens teckensnittegenskap till fet skrift att alla knappens bildtexter på panelen använder det (fetstil) teckensnittet.

Kontrollerar egendom

Alla komponenter som har samma förälder är tillgängliga som en del av kontroller förälderns egendom. Till exempel kan kontroller användas till iterera över alla fönsterkontrollens barn.

Nästa kodkod kan användas för att dölja alla innehållna komponenter på Panel1:

för ii: = 0 till Panel1.ControlCount - 1 do

 Panel1.Kontroller [ii]. Synlig: = falsk;


Tricking trick

Svängda kontroller har tre grundläggande egenskaper: de kan få inmatningsfokus, de använder systemresurser och de kan vara föräldrar till andra kontroller.

Till exempel är knappkomponenten en fönsterkontroll och kan inte vara överordnad till någon annan komponent - du kan inte placera en annan komponent på den. Saken är att Delphi döljer den här funktionen för oss. Ett exempel är den dolda möjligheten för en TStatusBar att ha vissa komponenter som TProgressBar på sig.

Äganderätt

Först bör du notera att ett formulär är den totala ägaren av alla komponenter som finns på det (placerat på formuläret vid designtid). Detta innebär att när en form förstörs, förstörs också alla komponenter på formuläret. Om vi ​​till exempel har en applikation med mer än ett formulär när vi kallar Free- eller Release-metoden för ett formulärobjekt, vi behöver inte oroa dig för att uttryckligen frigöra alla objekt på den formen - eftersom formuläret är ägaren till alla dess komponenter.

Varje komponent som vi skapar, vid design eller körtid, måste ägas av en annan komponent. Ägaren till en komponent - värdet på dess ägareegenskap - bestäms av en parameter som skickas till Skapa konstruktören när komponenten skapas. Det enda andra sättet att tilldela ägaren är att använda InsertComponent / RemoveComponent-metoderna under körning. Som standard äger ett formulär alla komponenter på det och ägs i sin tur av applikationen.

När vi använder nyckelordet Själv som parameter för Skapa metoden - objektet vi skapar ägs av den klass som metoden finns i - som vanligtvis är en Delphi-form.

Om vi ​​å andra sidan gör en annan komponent (inte formen) till ägaren av komponenten, gör vi den komponenten ansvarig för att bortskaffa objektet när det förstörs.

Som alla andra Delphi-komponent, skräddarsydda TFindFile-komponenter kan skapas, användas och förstöras vid körning. För att skapa, använda och frigöra en TFindFile-komponent vid körning kan du använda nästa kodavsnitt:

användningar Hitta fil;

...
var FFile: TFindFile;

procedur TForm1.InitializeData;

Börja // form ("Själv") är ägaren till komponenten // det finns inget förälder eftersom detta // är en osynlig komponent.

 FFile: = TFindFile. Skapa (Själv);

 ...

slutet;

Obs: Eftersom FFile skapas med en ägare (Form1) behöver vi inte göra någonting för att frigöra komponenten - den kommer att frigöras när ägaren förstörs.

Komponenter Egendom

Alla komponenter som delar samma ägare är tillgängliga som en del av Komponenters egendom av den ägaren. Följande procedur används för att rensa alla redigera komponenter som finns på formuläret:

procedur ClearEdits (AForm: TForm);

var

 ii: heltal;

Börja

för ii: = 0 till En form. ComponentCount-1 do

om (En form. Komponenter [ii] är tRedigera) sedan TEdit (AForm. Komponenter [ii]). Text: = '';

slutet; 

"föräldralösa"

Vissa kontroller (som ActiveX-kontroller) finns i fönster som inte är VCL snarare än i en överordnad kontroll. För dessa kontroller är föräldrarnas värde noll och den ParentWindow egenskapen anger fönstret som inte är VCL. Att ställa in ParentWindow flyttar kontrollen så att den finns i det angivna fönstret. ParentWindow ställs in automatiskt när en kontroll skapas med CreateParented metod.

Sanningen är att man i de flesta fall inte behöver bry sig om föräldrar och ägare, men när det gäller OOP och komponentutveckling eller när du vill ta Delphi ett steg framåt kommer uttalandena i den här artikeln att hjälpa dig att ta det steget snabbare.

instagram story viewer