Comment définir la valeur par défaut d'une propriété d'objet de composant?Delphi 2009: Valeur par défaut de la propriété Component Object
Code de classe Composant:
unit CustomClass;
interface
uses
Classes;
type
TCustomClass = class;
TConfiguration = class;
TCustomClass = class (TComponent)
private
FConfiguration: TConfiguration;
procedure SetConfiguration(const Value: TConfiguration);
published
property Configuration: TConfiguration read FConfiguration write SetConfiguration;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
TConfiguration = class (TPersistent)
private
FDelay: Integer;
FSize: Integer;
procedure SetDelay(const Value: Integer);
procedure SetSize(const Value: Integer);
published
property Delay: Integer read FDelay write SetDelay;
property Size: Integer read FSize write SetSize;
public
procedure Assign(Source: TPersistent); override;
end;
implementation
{ TCustomClass }
constructor TCustomClass.Create(AOwner: TComponent);
begin
inherited;
Configuration.FileName:= 'FileName';
Configuration.Size := 10;
end;
destructor TCustomClass.Destroy;
begin
Configuration.Free;
inherited;
end;
procedure TCustomClass.SetConfiguration(const Value: TConfiguration);
begin
FConfiguration.Assign(Value);
end;
{ TConfiguration }
procedure TConfiguration.Assign(Source: TPersistent);
begin
inherited;
Delay := (Source as TConfiguration).Delay;
Size := (Source as TConfiguration).Size;
end;
procedure TConfiguration.SetDelay(const Value: Integer);
begin
FDelay := Value;
end;
procedure TConfiguration.SetSize(const Value: Integer);
begin
FSize := Value;
end;
end.
Dans mon IDE, il apparaîtra comme a été modifié la propriété d'objet (gras bleu).
je pensais à faire défaut et fonctions stockées sur les propriétés de la classe TConfiguration, comme ceci:
TConfiguration
interface
private
function FileNameStored: Boolean;
published
property FileName: string read FFileName write SetFileName stored FileNameStored;
property Size: Integer read FSize write SetSize default 10;
implementation
function TConfiguration.FileNameStored: Boolean;
begin
Result := FileName <> 'FileName';
end;
Il colore les propriétés de TConfiguration en bleu normal, mais pas la propriété de configuration de TCustomClass et ce n'est pas là que je veux définir ses valeurs par défaut, est sur TCustomClass, puisque TConfiguration peut être utilisé dans d'autres composants.
Puis, je pensais aussi:
TCustomClass
interface
private
function ConfigurationStored: Boolean;
published
property Configuration: TConfiguration read FConfiguration write SetConfiguration stored ConfigurationStored;
implementation
function TCustomClass.ConfigurationStored: Boolean;
begin
Result := Configuration.FileName <> 'FileName' and
Configuration.Size <> 10;
end;
Mais, cela ne définit que la couleur de la propriété Configuration TCustomClass à bleu normal, pas ses propriétés.
RÉPONSE
Comme @RemyLebeau a fait remarquer (dans le premier et le haut réponse), il y avait des erreurs dans le code. Dans ce composant et dans ce cas, j'ai décidé de ne pas définir de valeur par défaut pour les propriétés.
Aviez-vous l'intention de déposer un objet de configuration sur un formulaire et de déposer la classe personnalisée sur un formulaire, puis de les connecter? Ou vouliez-vous que l'objet de configuration soit une propriété appartenant à la classe personnalisée et qu'il ne soit pas nécessaire de le créer et de l'assigner manuellement? –
Ensuite, vous avez vraiment oublié certaines choses évidentes, comme le souligne Remy. Il montre que vous devez créer explicitement (dans votre constructeur de classe) et libérer (dans votre destructeur de classe) TObject-types qui appartiennent à (sont une partie indivisible de) votre objet. Vous avez eu la classe de base correcte, donc c'est bien. Vous pouvez ajouter un OnChange: TNotificationEvent à votre objet de configuration. Il peut donc appeler la classe principale et faire quelque chose quand quelqu'un écrit dans une propriété de configuration. –
@WarrenP Oui. Je l'ai corrigé, mais comme @NGLN l'a souligné, cela n'a pas de sens de le corriger sur la question, car cela rend la réponse inutile.Le 'OnChange: TNotificationEvent' est vraiment un bon conseil, je l'ai aimé, car je peux changer la valeur' stored' des propriétés si elles sont une variable privée de classe. Merci. –