Création des propriétés pour interfaces

De RAD Studio
Aller à : navigation, rechercher

Remonter à Création de propriétés - Index


Vous pouvez utiliser une interface comme valeur d'une propriété publiée, presque comme si vous utilisiez un objet. Cependant, le mécanisme par lequel votre composant reçoit les notifications de l'implémentation de l'interface est différent. Dans Création de propriétés pour sous-composants, le setter de la propriété appelait la méthode FreeNotification du composant assigné comme valeur à la propriété. Cela permettait au composant de se mettre à jour lorsqu'était libéré le composant servant de valeur à la propriété. Mais, lorsque la valeur de la propriété est une interface, vous n'avez pas accès au composant implémentant cette interface. Il s'ensuit que vous ne pouvez pas appeler sa méthode FreeNotification.

Pour gérer une telle situation, vous pouvez appeler la méthode ReferenceInterface de votre composant :

procedure TDemoComponent.SetMyIntfProp(const Value: IMyInterface);
begin
  ReferenceInterface(FIntfField, opRemove);
  FIntfField := Value;
  ReferenceInterface(FIntfField, opInsert);
end;

Appeler ReferenceInterface avec une interface est équivalent à appeler la méthode FreeNotification d'un autre composant. Donc, après l'appel de ReferenceInterface depuis le setter de la propriété, vous pouvez redéfinir la méthode Notification pour gérer les notifications depuis l'implémenteur de l'interface :

procedure TDemoComponent.Notification(AComponent: TComponent; Operation: TOperation);
begin
  inherited Notification(AComponent, Operation);
  if (Assigned(MyIntfProp)) and (AComponent.IsImplementorOf(MyInftProp)) then
    MyIntfProp := nil;
end;

Notez que le code de Notification assigne la valeur nil à la propriété MyIntfProp, et non au champ privé (FIntfField). Cela garantit que Notification appelle le setter de la propriété, qui appelle ReferenceInterface pour annuler la demande de notification établie lorsque la valeur de la propriété a été définie au préalable. Toutes les assignations de la propriété interface doivent se faire via le setter de la propriété.

Voir aussi