ステップ 2 - 書式を指定するプロパティを実装する
既存のコンポーネントを拡張してスタイル付きの FireMonkey コンポーネントを作成する への移動
ステップ 1 で作成した TClockLabel コンポーネントに、現在時刻を表示するときに使用する日時の書式をプロパティとして定義し、コンポーネント ユーザーが指定できるようにする必要があります。
書式を指定するプロパティを実装する
Format プロパティを実装するために、TClockLabel クラスの published セクションに次の 1 行を追加します。
Delphi の場合:
property Format: String;
C++ の場合:
__property String Format;
さらに、public セクションに次のようにコンストラクタの定義を追加します。
Delphi の場合:
constructor Create(AOwner: TComponent); override;
C++ の場合:
__fastcall TClockLabel(TComponent* Owner);
書式が変更されると、ラベルを更新しなければなりません。 ラベルの更新を処理するための UpdateLabel メソッドを private メンバとして追加します。
コードは次のようになります。
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;
C++ の場合:
//header file
class PACKAGE TClockLabel : public TLabel {
private:
void __fastcall UpdateLabel(void);
protected:
public:
__fastcall TClockLabel(TComponent* Owner);
__published:
__property String Format;
};
この行を追加した後で、Ctrl+Shift+C
を押します。 すると、Format プロパティの設定アクセサ メソッドとコンストラクタのスケルトンが IDE により自動的に追加されます。 これでコードは次のようになります。
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;
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;
}
System.SysUtils.DateTimeToString のドキュメントによると、日時形式の一般的な値は 'c'
です。そのため、FFormat フィールドを 'c'
で初期化します。
Delphi の場合
constructor TClockLabel.Create(AOwner: TComponent);
begin
inherited;
FFormat := 'c';
end;
C++ の場合:
//source file
__fastcall TClockLabel::TClockLabel(TComponent* Owner) : TLabel(Owner) {
FFormat = 'c';
}
さらに、UpdateLabel メソッドと SetFormat メソッドを次のように実装します。
Delphi の場合:
procedure TClockLabel.UpdateLabel;
begin
Text := FormatDateTime(FFormat, Now);
end;
procedure TClockLabel.SetFormat(const Value: String);
begin
FFormat := Value;
UpdateLabel;
end;
C++ の場合:
void __fastcall TClockLabel::UpdateLabel(void) {
Text = FormatDateTime(FFormat, Now());
}
void __fastcall TClockLabel::SetFormat(const String Value) {
FFormat = Value;
UpdateLabel();
}
親コンポーネントのスタイルを継承する
コンポーネントにその親コンポーネントのスタイルを継承させたい場合には、次のコードを使用します:
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
}