ステップ 3 - TTimer を使用して TClockLabel を毎秒更新する
既存のコンポーネントを拡張してスタイル付きの FireMonkey コンポーネントを作成する への移動
このチュートリアルでは、TClockLabel を毎秒更新できるよう、TTimer コンポーネントを内部的に使用します。 TClockLabel コンポーネント内で TTimer コンポーネントを使用するには、以下の処理を行う必要があります。
- TClockLabel のコンストラクタで TTimer のインスタンスを作成する。
- 1 秒ごとに OnTimer イベントを発生させるよう TTimer コンポーネントを構成する。
- OnTimer イベントが発生したときに Text プロパティを更新する。
- TClockLabel のデストラクタで TTimer のインスタンスを破棄する。
これらの処理を行うために、以下のメンバの定義を追加します(既に作成したメンバはここに示していません)。
Delphi の場合:
type
TClockLabel = class(TLabel)
private
FTimer: TTimer;
procedure OnTimer(Sender: TObject);
public
destructor Destroy; override;
end;
C++ の場合:
class PACKAGE TClockLabel : public TLabel {
private:
TTimer* FTimer;
void __fastcall OnTimer(TObject* Sender);
public:
__fastcall ~TClockLabel(void);
};
以前のステップと同様に、Ctrl+Shift+C
を押すとメソッドのプレースホルダが作成されます。
メソッドを次のように実装します:
Delphi の場合:
constructor TClockLabel.Create(AOwner: TComponent);
begin
FFormat := 'c';
inherited;
// No need to use TTimercompoment at design time.
if not (csDesigning in ComponentState) then
begin
FTimer := TTimer.Create(AOwner);
FTimer.OnTimer := OnTimer;
FTimer.Interval := 1000;
FTimer.Enabled := True;
end;
UpdateLabel;
end;
destructor TClockLabel.Destroy;
begin
FreeAndNil(FTimer);
inherited;
end;
procedure TClockLabel.OnTimer(Sender: TObject);
begin
UpdateLabel;
end;
C++ の場合:
__fastcall TClockLabel::TClockLabel(TComponent* Owner) : TLabel(Owner) {
FFormat = 'c';
FTimer = new TTimer(Owner);
FTimer->OnTimer = OnTimer;
FTimer->Interval = 1000;
FTimer->Enabled = true;
UpdateLabel();
}
__fastcall TClockLabel::~TClockLabel() {
FreeAndNil(FTimer);
}
void __fastcall TClockLabel::OnTimer(TObject* Sender) {
UpdateLabel();
}
お気付きのように、TTimer のインスタンスを作成するかどうかは ComponentState プロパティによって決まります。 これは、設計時(IDE で実行しているとき)にはラベルを更新する必要がないためです。 IDE の外部で(標準のアプリケーションとして)コンポーネントを実行するときにだけ TTimer コンポーネントを作成するよう制限しています。
これで TClockLabel コンポーネントが実装されました。 [プロジェクト マネージャ]で、TClockLabel.bpl パッケージを右クリックし、コンテキスト メニューから[ビルド]を選択します。 そして、[インストール]を選択して、開発されたコンポーネント パッケージをインストールし、コンポーネントを登録します:
これで、TClockLabel のコンポーネントの新しい動作が、フォーム デザイナ で参照可能になりました。