Redéfinition de la méthode DefineProperties

De RAD Studio
Aller à : navigation, rechercher

Remonter à Stockage et chargement des propriétés non publiées


Après avoir créé des méthodes de stockage et de chargement de la valeur de propriété, vous pouvez redéfinir la méthode DefineProperties du composant. Delphi appelle cette méthode lors du chargement ou du stockage du composant. Dans la méthode DefineProperties, vous devez appeler la méthode DefineProperty ou DefineBinaryProperty du filer en cours, en lui transmettant la méthode à utiliser pour le chargement ou l'enregistrement de la valeur de propriété. Si vos méthodes de chargement et de stockage sont des types TWriterProc et TReaderProc, vous appelez alors la méthode DefineProperty du filer. Si vous avez créé des méthodes de type TStreamProc, appelez plutôt DefineBinaryProperty.

Peu importe la méthode utilisée pour définir la propriété, vous lui transmettez les méthodes enregistrant et chargeant votre valeur de propriété ainsi qu'une valeur booléenne indiquant si la valeur de propriété doit être écrite ou non. S'il peut s'agir d'une valeur héritée ou si elle a une valeur par défaut, il n'est pas nécessaire de l'écrire.

Soit par exemple la méthode LoadCompProperty du type TReaderProc et la méthode StoreCompProperty du type TWriterProc, vous redéfiniriez DefineProperties de la manière suivante :

procedure TSampleComponent.DefineProperties(Filer: TFiler);
  function DoWrite: Boolean;
  begin
    if Filer.Ancestor <> nil then { tester Ancestor pour une valeur héritée }
    begin
      if TSampleComponent(Filer.Ancestor).MyCompProperty = nil then
        Result := MyCompProperty <> nil
      else   if (MyCompProperty = nil) or
         (TMy5Comp(Filer.Ancestor).MyCompProperty.Name <> MyCompProperty.Name) then
        Result := True
      else Result := False;
    end
    else { pas de valeur héritée – tester pour une valeur par défaut nil) }
      Result := MyCompProperty <> nil;
  end;
begin
  inherited; { autoriser les classes de base pour définir les propriétés }
  Filer.DefineProperty('MyCompProperty', LoadCompProperty, StoreCompProperty, DoWrite);
end;
void __fastcall TSampleComponent::DefineProperties(TFiler *Filer)
{
  // autorise au préalable les classes de base à définir leurs propriétés.
  // Dans le cadre de cet exemple, TSampleComponent dérive directement de TComponent
  TComponent::DefineProperties(Filer);
  bool WriteValue;
  if (Filer->Ancestor) // teste pour une valeur héritée
  {
    if ((TSampleComponent *)Filer->Ancestor)->MyCompProperty == NULL)
      WriteValue = (MyCompProperty != NULL);
    else if ((MyCompProperty == NULL) ||
             (((TSampleComponent *)Filer->Ancestor)->MyCompProperty->Name !=
                                                     MyCompProperty->Name))
      WriteValue = true;
    else WriteValue = false;
  }
  else // si aucune valeur héritée, écrit la propriété si différente de NULL
    WriteValue = (MyCompProperty != NULL);
  Filer->DefineProperty("MyCompProperty ",LoadCompProperty,StoreCompProperty, WriteValue);
end;