Etape 2 - Implémenter une propriété pour spécifier le format
Remonter à Création d'un composant FireMonkey stylé par extension d'un composant existant
Le composant TClockLabel créé à l'étape 1 doit définir le format date/heure quand il présente l'heure en cours sous la forme d'une propriété afin que les utilisateurs du composant puissent la modifier.
Sommaire
Implémentation d'une propriété pour spécifier le format
Pour implémenter la propriété Format, ajoutez la ligne suivante à la section published du TClockLabelclass :
Dans Delphi :
property Format: String;
Dans C++ :
__property String Format;
Ajoutez aussi une définition du constructeur à la section public, comme suit :
Dans Delphi :
constructor Create(AOwner: TComponent); override;
Dans C++ :
__fastcall TClockLabel(TComponent* Owner);
Dès que le composant Format est changé, Label doit être mis à jour. Pour prendre en charge la mise à jour du libellé, introduisez la méthode UpdateLabel en tant que méthode private.
Le code doit ressembler à ceci :
Dans Delphi :
type
TClockLabel = class(TLabel)
private
{ Private declarations }
procedure UpdateLabel;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
published
{ Published declarations }
property Format: String;
end;
Dans C++ :
//header file
class PACKAGE TClockLabel : public TLabel {
private:
void __fastcall UpdateLabel(void);
protected:
public:
__fastcall TClockLabel(TComponent* Owner);
__published:
__property String Format;
};
Après l'insertion de cette ligne, appuyez sur CTRL+MAJ+C
. L'EDI ajoute automatiquement un accesseur en écriture pour la propriété Format et un squelette pour le constructeur. Le code doit maintenant ressembler à ceci :
Dans Delphi :
type
TClockLabel = class(TLabel)
private
FFormat: String;
procedure SetFormat(const Value: String);
public
constructor Create(AOwner: TComponent); override;
published
property Format: String read FFormat write SetFormat;
end;
{ TClockLabel }
constructor TClockLabel.Create(AOwner: TComponent);
begin
inherited;
end;
procedure TClockLabel.UpdateLabel;
begin
end;
procedure TClockLabel.SetFormat(const Value: String);
begin
FFormat := Value;
end;
Dans C++ :
//header file
class PACKAGE TClockLabel : public TLabel {
private:
String FFormat;
void __fastcall UpdateLabel(void);
void __fastcall SetFormat(const String Value);
protected:
public:
__fastcall TClockLabel(TComponent* Owner) ;
__published:
__property String Format = {read = FFormat, write = SetFormat};
};
//source file
__fastcall TClockLabel::TClockLabel(TComponent* Owner) : TLabel(Owner) {
}
void __fastcall TClockLabel::UpdateLabel(void) {
}
void __fastcall TClockLabel::SetFormat(const String Value) {
FFormat = Value;
}
Conformément à la documentation de System.SysUtils.DateTimeToString, la valeur typique du format date/heure est 'c'
. Initialisez le champ FFormat avec 'c'
.
Dans Delphi :
constructor TClockLabel.Create(AOwner: TComponent);
begin
inherited;
FFormat := 'c';
end;
Dans C++ :
//source file
__fastcall TClockLabel::TClockLabel(TComponent* Owner) : TLabel(Owner) {
FFormat = 'c';
}
Implémentez maintenant les méthodes UpdateLabel et SetFormat comme suit :
Dans Delphi :
procedure TClockLabel.UpdateLabel;
begin
Text := FormatDateTime(FFormat, Now);
end;
procedure TClockLabel.SetFormat(const Value: String);
begin
FFormat := Value;
UpdateLabel;
end;
Dans C++ :
void __fastcall TClockLabel::UpdateLabel(void) {
Text = FormatDateTime(FFormat, Now());
}
void __fastcall TClockLabel::SetFormat(const String Value) {
FFormat = Value;
UpdateLabel();
}
Héritage des styles du composant parent
Si vous voulez que votre composant hérite des styles du composant parent, utilisez le code suivant :
type
TClockLabel = class(TLabel)
private
{ Private declarations }
procedure UpdateLabel;
function GetDefaultStyleLookupName: string; override;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
published
{ Published declarations }
property Format: String;
end;
function TMyButton.GetDefaultStyleLookupName: string;
begin
Result := Self.GetParentClassStyleLookupName; // stylename of the parent component
end;
//header file
class PACKAGE TClockLabel : public TLabel {
private:
void __fastcall UpdateLabel(void);
System::UnicodeString __fastcall GetDefaultStyleLookupName(void);
protected:
public:
__fastcall TClockLabel(TComponent* Owner);
__published:
__property String Format;
};
System::UnicodeString __fastcall TClockLabel::GetDefaultStyleLookupName() {
return this->GetParentClassStyleLookupName(); // stylename of the parent component
}