Création de propriétés pour sous-composants
Remonter à Création de propriétés - Index
Par défaut, lorsque la valeur d'une propriété est un autre composant, vous lui attribuez une valeur en ajoutant à la fiche ou au module de données une instance de cet autre composant et en assignant ensuite le composant comme valeur à la propriété. Mais, il est aussi possible que votre composant crée sa propre instance de l'objet qui implémente la valeur de la propriété. Un tel composant dédié s'appelle un sous-composant.
Les sous-composants peuvent être constitué de n'importe quel objet persistant (tout descendant de TPersistent). Au contraire des composants séparés qui peuvent se trouver assignés comme valeur d'une propriété, les propriétés publiées des sous-composants sont enregistrées avec le composant qui les crée. Mais, pour que cela fonctionne, les conditions suivantes doivent être respectées :
- Le Owner du sous-composant doit être le composant qui le crée et l'utilise comme valeur d'une propriété publiée. Pour les sous-composants descendant de TComponent, vous pouvez réaliser cela en définissant la propriété Owner du sous-composant. Pour les autres sous-composants, vous devez redéfinir la méthode GetOwner de l'objet persistant de façon à ce qu'elle renvoie le composant créateur.
- Si le sous-composant est un descendant de TComponent, il doit indiquer qu'il est un sous-composant en appelant la méthode SetSubComponent. Habituellement, cet appel est effectué par le propriétaire lorsqu'il crée le sous-composant ou par le constructeur du sous-composant.
Remarque : Lorsqu'un composant à sous-composants est mis en flux, les sous-composants ont désormais leur indicateur csLoading défini et leur méthode Loaded appelée. Cela peut compliquer l'utilisation des propriétés de sous-composants qui sont accessibles en écriture. Si vous permettez que la propriété de votre sous-composant soit attribuée à une référence de composant externe, alors vous ne pouvez pas libérer votre sous-composant jusqu'à l'appel de la méthode Loaded de son propriétaire. Sinon, le système de flux tentera d'appeler la méthode Loaded du sous-composant après la libération du sous-composant.
En général, les propriétés dont les valeurs sont des sous-composants sont accessibles en lecture seulement. Si vous autorisez la modification d'une propriété dont la valeur est un sous-composant, la méthode définissant la propriété, le setter, doit libérer le sous-composant lorsqu'un autre composant est assigné comme valeur à la propriété. De plus, le composant ré-instancie souvent son sous-composant lorsque la propriété est définie sur nil. Sinon, lorsque la propriété a été définie par un autre composant, le sous-composant ne peut plus être restauré à la conception.
Remarquez que le setter de la propriété a appelé la méthode FreeNotification du composant défini comme valeur de la propriété. Cet appel garantit que le composant servant de valeur à la propriété envoie une notification au moment où il est sur le point d'être détruit. Il envoie cette notification en appelant la méthode Notification. Vous gérez cet appel en redéfinissant la méthode Notification.