タイマーが必要なクラスがあります。このクラスは、VCL と FMX の両方で動作する必要があります。残念ながら、FMX タイマーは で宣言されFMX.Types
、VCL タイマーは で宣言されていVcl.ExtCtrls
ます。
クロスプラットフォームクラスでタイマーを使用する方法のような条件定義がないため{$IFDEF FMX}xxx{$ENDIF}
?
タイマーが必要なクラスがあります。このクラスは、VCL と FMX の両方で動作する必要があります。残念ながら、FMX タイマーは で宣言されFMX.Types
、VCL タイマーは で宣言されていVcl.ExtCtrls
ます。
クロスプラットフォームクラスでタイマーを使用する方法のような条件定義がないため{$IFDEF FMX}xxx{$ENDIF}
?
TTimer
はコンポーネントであるため、インターフェースをサポートします。インターポーザー クラスを使用して ITimer インターフェイスを元のタイマー クラスに挿入し、このインターフェイスに対してのみプログラムします (これは両方のTTimer
クラスに共通です)。
unit Mv.TimerIntf;
interface
uses
System.Classes;
type
ITimer = interface
function PropGetEnabled: Boolean;
function PropGetInterval: Cardinal;
function PropGetOnTimer: TNotifyEvent;
procedure PropSetEnabled(AValue: Boolean);
procedure PropSetInterval(AValue: Cardinal);
procedure PropSetOnTimer(AValue: TNotifyEvent);
property Enabled: Boolean read PropGetEnabled write PropSetEnabled;
property Interval: Cardinal read PropGetInterval write PropSetInterval;
property OnTimer: TNotifyEvent read PropGetOnTimer write PropSetOnTimer;
end;
implementation
end.
と
unit Mv.VCL.Interposer.Timer;
interface
uses
Mv.TimerIntf,
System.Classes,
VCL.ExtCtrls;
type
TTimer = class(VCL.ExtCtrls.TTimer, ITimer)
function PropGetEnabled: Boolean;
function PropGetInterval: Cardinal;
function PropGetOnTimer: TNotifyEvent;
procedure PropSetEnabled(AValue: Boolean);
procedure PropSetInterval(AValue: Cardinal);
procedure PropSetOnTimer(AValue: TNotifyEvent);
end;
implementation
function TTimer.PropGetEnabled: Boolean;
begin
Result := Enabled;
end;
function TTimer.PropGetInterval: Cardinal;
begin
Result := Interval;
end;
function TTimer.PropGetOnTimer: TNotifyEvent;
begin
Result := OnTimer;
end;
procedure TTimer.PropSetEnabled(AValue: Boolean);
begin
Enabled := AValue;
end;
procedure TTimer.PropSetInterval(AValue: Cardinal);
begin
Interval := AValue;
end;
procedure TTimer.PropSetOnTimer(AValue: TNotifyEvent);
begin
OnTimer := AValue;
end;
end.
...
使用法:インターフェイスに対するコード:
procedure InitTimer(ATimer: ITimer)
begin
ATimer.Interval := 100;
ATimer.OnTimer := DoWhatEver;
end;
...
uses
Vcl.ExtCtrls,
Mv.VCL.Interposer.Timer;
type
TForm1 = class(TForm)
Timer1: TTimer;
end;
//...
begin
InitTimer(Timer1);
end;