Eigenaar begrijpen versus Ouder in Delphi-toepassingen

Telkens wanneer u een paneel op een formulier en een knop op dat paneel plaatst, maakt u een "onzichtbare" verbinding. De vorm wordt de eigenaar van de knop en het paneel is ingesteld als zijn ouder.

Elk Delphi-onderdeel heeft de eigenschap Eigenaar. De eigenaar zorgt voor bevrijdend de componenten in eigendom wanneer deze worden vrijgegeven.

Op dezelfde manier, maar anders, geeft de eigenschap Parent de component aan die de component 'child' bevat.

Ouder

Ouder verwijst naar de component waarin zich een andere component bevindt, zoals TForm, TGroupBox of een TPanel. Als één besturingselement (ouder) andere bevat, wordt het bevatte bedieningselementen zijn kindbesturingen van de ouder.

Ouder bepaalt hoe de component wordt weergegeven. De eigenschappen Left en Top zijn bijvoorbeeld allemaal relatief ten opzichte van de ouder.

De eigenschap Parent kan tijdens runtime worden toegewezen en gewijzigd.

Niet alle componenten hebben de ouder. Veel formulieren hebben geen ouder. Voor formulieren die rechtstreeks op het Windows-bureaublad verschijnen, is Ouder bijvoorbeeld ingesteld op nul. Een component

instagram viewer
HasParent methode retourneert een booleaanse waarde die aangeeft of aan het onderdeel een ouder is toegewezen.

We gebruiken de eigenschap Parent om de ouder van een besturingselement op te halen of in te stellen. Plaats bijvoorbeeld twee panelen (Panel1, Panel2) op een formulier en plaats een knop (Button1) op het eerste paneel (Panel1). Hiermee wordt de eigenschap Parent van Button ingesteld op Panel1.

 Button1.Parent: = Panel2; 

Als u de bovenstaande code in de OnClick-gebeurtenis voor het tweede paneel plaatst, wanneer u op Panel2 klikt, "springt" de knop van Panel1 naar Panel2: Panel1 is niet langer de ouder voor de knop.

Wanneer u tijdens de uitvoering een TButton wilt maken, is het belangrijk dat we niet vergeten een ouder toe te wijzen - het besturingselement dat de knop bevat. Voor een component zichtbaar te zijn, het moet een ouder hebben om zichzelf binnen te laten zien.

ParentThis en ParentThat

Als u tijdens het ontwerp een knop selecteert en naar de Object Inspector kijkt, ziet u verschillende "ouderbewuste" eigenschappen. De ParentFontgeeft bijvoorbeeld aan of het lettertype dat wordt gebruikt voor het bijschrift van de knop hetzelfde is als het lettertype dat wordt gebruikt voor het bovenliggende element van de knop (in het vorige voorbeeld: deelvenster 1). Als ParentFont waar is voor alle knoppen op een paneel, zorgt het wijzigen van de eigenschap Lettertype van het paneel ervoor dat alle bijschriften op het paneel dat (vetgedrukte) lettertype gebruiken.

Beheert eigendom

Alle componenten die dezelfde ouder delen, zijn beschikbaar als onderdeel van de Bedieningselementen eigendom van die ouder. Besturingselementen kunnen bijvoorbeeld worden gebruikt itereer over alle kinderen van de raambediening.

Het volgende stuk code kan worden gebruikt om alle componenten op Panel1 te verbergen:

voor ii: = 0 naar Panel1.ControlCount - 1 Doen

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


Tricks Tricks

Besturingselementen met vensters hebben drie basiskenmerken: ze kunnen de invoerfocus ontvangen, ze gebruiken systeembronnen en ze kunnen ouders zijn van andere besturingselementen.

Het component Button is bijvoorbeeld een besturingselement met venster en kan niet het bovenliggende element zijn van een ander component - u kunt er geen ander component op plaatsen. Het ding is dat Delphi deze functie voor ons verbergt. Een voorbeeld is de verborgen mogelijkheid voor een TStatusBar om sommige componenten zoals TProgressBar erop te hebben.

Eigendom

Merk allereerst op dat een formulier de algehele eigenaar is van alle componenten die erop staan ​​(gepositioneerd op het formulier tijdens het ontwerpen). Dit betekent dat wanneer een formulier wordt vernietigd, alle componenten op het formulier ook worden vernietigd. Als we bijvoorbeeld een toepassing hebben met meer dan één formulier wanneer we de methode Vrij of Vrijgeven aanroepen voor een formulierobject, dan doen we dat u hoeft zich geen zorgen te maken over het expliciet vrijmaken van alle objecten op dat formulier - omdat het formulier de eigenaar is van al het componenten.

Elk onderdeel dat we maken, tijdens ontwerp of uitvoering, moet eigendom zijn van een ander onderdeel. De eigenaar van een component - de waarde van de eigenschap Owner - wordt bepaald door een parameter die wordt doorgegeven aan de constructor Create wanneer de component wordt gemaakt. De enige andere manier om de Eigenaar opnieuw toe te wijzen is het gebruik van de methoden InsertComponent / RemoveComponent tijdens runtime. Standaard bezit een formulier alle componenten die erop staan ​​en is op zijn beurt eigendom van de Applicatie.

Wanneer we het trefwoord gebruiken Zelf als parameter voor de Create-methode - het object dat we maken is eigendom van de klasse waarin de methode zich bevindt - wat meestal een Delphi-vorm is.

Als we aan de andere kant een ander onderdeel (niet het formulier) de eigenaar van het onderdeel maken, dan stellen we dat onderdeel verantwoordelijk voor de verwijdering van het object wanneer het wordt vernietigd.

Zoals elk ander Delphi-component, op maat gemaakte TFindFile-component kan tijdens runtime worden gemaakt, gebruikt en vernietigd. Om een ​​te maken, te gebruiken en gratis te maken TFindFile-component bij uitvoering kunt u het volgende codefragment gebruiken:

toepassingen Vind bestand;

...
var FFile: TFindFile;

procedure TForm1.InitializeData;

beginnen // form ("Self") is de eigenaar van het onderdeel // er is geen bovenliggend element omdat dit // een onzichtbaar onderdeel is.

 Bestand: = TFindFile. Creëer (Zelf);

 ...

einde;

Opmerking: aangezien de FFile is gemaakt met een eigenaar (Form1), hoeven we niets te doen om het onderdeel vrij te maken - het wordt vrijgegeven wanneer de eigenaar wordt vernietigd.

Componenten Eigenschap

Alle componenten die dezelfde eigenaar delen, zijn beschikbaar als onderdeel van de Eigenschappen van componenten van die eigenaar. De volgende procedure wordt gebruikt om alle bewerkingscomponenten op het formulier te wissen:

procedure ClearEdits (AForm: TForm);

var

 ii: geheel getal;

beginnen

voor ii: = 0 naar Een vorm. ComponentCount-1 Doen

als (Een vorm. Componenten [ii] is TEdit) vervolgens TEdit (AForm. Componenten [ii]) .Tekst: = '';

einde; 

"Wezen"

Sommige besturingselementen (zoals ActiveX-besturingselementen) bevinden zich in niet-VCL-vensters in plaats van in een bovenliggend besturingselement. Voor deze besturingselementen is de waarde van Ouder nihil en de Bovenliggend venster eigenschap specificeert het niet-VCL bovenliggende venster. Door ParentWindow in te stellen, wordt het besturingselement verplaatst zodat het zich in het opgegeven venster bevindt. ParentWindow wordt automatisch ingesteld wanneer een besturingselement wordt gemaakt met de CreateParented methode.

De waarheid is dat je in de meeste gevallen niet om ouders en eigenaren hoeft te geven, maar als het gaat om OOP en component ontwikkeling of wanneer u Delphi een stap vooruit wilt zetten, zullen de verklaringen in dit artikel u helpen om die stap sneller te zetten.