Comprendre le propriétaire par rapport à Parent dans les applications Delphi

click fraud protection

Chaque fois que vous placez un panneau sur un formulaire et un bouton sur ce panneau, vous établissez une connexion "invisible". Le formulaire devient le propriétaire du bouton, et le panneau est réglé pour être son parent.

Chaque composant Delphi a une propriété Owner. Le propriétaire prend soin de libération les composants possédés lors de sa libération.

Similaire, mais différente, la propriété Parent indique le composant qui contient le composant "enfant".

Parent

Parent fait référence au composant dans lequel un autre composant est contenu, tel que TForm, TGroupBox ou TPanel. Si un contrôle (parent) en contient d'autres, le contrôles contenus sont des contrôles enfants du parent.

Le parent détermine la façon dont le composant est affiché. Par exemple, les propriétés Left et Top sont toutes relatives au parent.

La propriété Parent peut être affectée et modifiée pendant l'exécution.

Tous les composants n'ont pas le parent. De nombreux formulaires n'ont pas de parent. Par exemple, les formulaires qui apparaissent directement sur le bureau Windows ont Parent défini sur nil. Un composant

instagram viewer
HasParent renvoie une valeur booléenne indiquant si le composant a été affecté ou non à un parent.

Nous utilisons la propriété Parent pour obtenir ou définir le parent d'un contrôle. Par exemple, placez deux panneaux (Panel1, Panel2) sur un formulaire et placez un bouton (Button1) sur le premier panneau (Panel1). Cela définit la propriété Parent de Button sur Panel1.

 Button1.Parent: = Panel2; 

Si vous placez le code ci-dessus dans l'événement OnClick pour le deuxième Panel, lorsque vous cliquez sur Panel2, le bouton "saute" de Panel1 à Panel2: Panel1 n'est plus le parent du bouton.

Lorsque vous souhaitez créer un TButton au moment de l'exécution, il est important de ne pas oublier d'affecter un parent - le contrôle qui contient le bouton. Pour qu'un composant soit visible, il doit avoir un parent pour s'afficher dans.

ParentThis et ParentThat

Si vous sélectionnez un bouton au moment de la conception et regardez l'inspecteur d'objets, vous remarquerez plusieurs propriétés "conscientes des parents". le ParentFont, par exemple, indique si la police utilisée pour la légende du bouton est la même que celle utilisée pour le parent du bouton (dans l'exemple précédent: Panel1). Si ParentFont a la valeur True pour tous les boutons d'un panneau, la modification de la propriété Font du panneau en gras oblige toutes les légendes de bouton du panneau à utiliser cette police (en gras).

Propriété Controls

Tous les composants qui partagent le même parent sont disponibles dans le cadre du Contrôles propriété de ce parent. Par exemple, les contrôles peuvent être utilisés pour itérer sur tous les enfants du contrôle fenêtré.

Le morceau de code suivant peut être utilisé pour masquer tous les composants contenus sur Panel1:

pour ii: = 0 à Panel1.ControlCount - 1 faire

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


Tricks Tricks

Les contrôles fenêtrés ont trois caractéristiques de base: ils peuvent recevoir le focus d'entrée, ils utilisent les ressources système et ils peuvent être les parents d'autres contrôles.

Par exemple, le composant Button est un contrôle fenêtré et ne peut pas être le parent d'un autre composant - vous ne pouvez pas y placer un autre composant. Le fait est que Delphi nous cache cette fonctionnalité. Un exemple est la possibilité cachée pour un TStatusBar d'avoir des composants comme TProgressBar dessus.

La possession

Tout d'abord, notez qu'un formulaire est le propriétaire global de tous les composants qui y résident (positionnés sur le formulaire au moment du design). Cela signifie que lorsqu'un formulaire est détruit, tous les composants du formulaire sont également détruits. Par exemple, si nous avons une application avec plusieurs formulaires lorsque nous appelons la méthode Free ou Release pour un objet de formulaire, nous ne vous souciez pas de libérer explicitement tous les objets de ce formulaire, car le formulaire est le propriétaire de tous ses Composants.

Chaque composant que nous créons, au moment de la conception ou de l'exécution, doit appartenir à un autre composant. Le propriétaire d'un composant (la valeur de sa propriété Owner) est déterminé par un paramètre transmis au constructeur Create lors de la création du composant. La seule autre façon de réaffecter le propriétaire consiste à utiliser les méthodes InsertComponent / RemoveComponent pendant l'exécution. Par défaut, un formulaire possède tous les composants qui s'y trouvent et appartient à son tour à l'application.

Lorsque nous utilisons le mot-clé Soi comme paramètre de la méthode Create - l'objet que nous créons appartient à la classe dans laquelle la méthode est contenue - qui est généralement un formulaire Delphi.

Si d'un autre côté, nous rendons un autre composant (pas la forme) propriétaire du composant, alors nous rendons ce composant responsable de l'élimination de l'objet lorsqu'il est détruit.

Comme tout autre Composant Delphi, Le composant TFindFile personnalisé peut être créé, utilisé et détruit au moment de l'exécution. Pour créer, utiliser et libérer un Composant TFindFile lors de l'exécution, vous pouvez utiliser l'extrait de code suivant:

les usages Trouver un fichier;

...
var FFile: TFindFile;

procédure TForm1.InitializeData;

commencer // form ("Self") est le propriétaire du composant // il n'y a pas de parent car il s'agit // d'un composant invisible.

 FFile: = TFindFile. Créer (Soi);

 ...

fin;

Remarque: Puisque le FFile est créé avec un propriétaire (Form1), nous n'avons rien à faire pour libérer le composant - il sera libéré lorsque le propriétaire sera détruit.

Propriété des composants

Tous les composants qui partagent le même propriétaire sont disponibles dans le cadre du Propriété des composants de ce propriétaire. La procédure suivante est utilisée pour effacer tous les composants Edit qui se trouvent sur le formulaire:

procédure ClearEdits (AForm: TForm);

var

 ii: Entier;

commencer

pour ii: = 0 à Une forme. ComponentCount-1 faire

si (Une forme. Composants [ii] est TEdit) ensuite TEdit (AForm. Composants [ii]). Texte: = '';

fin; 

"Orphelins"

Certains contrôles (tels que les contrôles ActiveX) sont contenus dans des fenêtres non VCL plutôt que dans un contrôle parent. Pour ces contrôles, la valeur de Parent est néant et le ParentWindow La propriété spécifie la fenêtre parent non VCL. La définition de ParentWindow déplace le contrôle afin qu'il soit contenu dans la fenêtre spécifiée. ParentWindow est défini automatiquement lorsqu'un contrôle est créé à l'aide du CreateParented méthode.

La vérité est que dans la plupart des cas, vous n'avez pas besoin de vous soucier des parents et des propriétaires, mais en ce qui concerne la POO et développement de composants ou lorsque vous souhaitez faire avancer Delphi d'un pas, les instructions de cet article vous aideront à faire ce pas plus rapidement.

instagram story viewer