Redéfinition de la méthode DefineProperties
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;