5

私は2日前にDelphiを学び始めましたが、行き詰まりました。何も進まないので故障したので、ここに書くことにしました。独自のTTimerオブジェクトを持つフィールドを持ち、ある時間間隔で何らかのアクションを実行するクラスを作成したかったのです。それも可能ですか?次のようなコードがあるとします。

Sth = class
private

public
  clock:TTimer;
  procedure clockTimer(Sender: TObject);
  constructor Create();
end;

constructor Sth.Create()
begin
  clock.interval:=1000;
  clock.OnTimer := clockTimer;
end;

procedure Sth.clockTimer(Sender: TObject);
begin
  //some action on this Sth object at clock.interval time...
end;

私の同様のコードはコピーされますが、正しく機能しません。コンストラクターを呼び出すと、プログラムがクラッシュします(行:clock.interval:= 1000;でのアクセス違反)。何がわからない

Sender:TObject 

そうですが、それは問題ではないと思います。私がしたいようなクラスを作成することは可能ですか?

4

1 に答える 1

12

タイマーを作成していません。変数を宣言するだけでは不十分です。タイマーを作成する必要があります。

constructor Sth.Create()
begin
  clock := TTimer.Create(nil);
  clock.interval:=1000;
  clock.OnTimer := clockTimer;
end;

そして、あなたもそれを破壊する必要があります。クラスにデストラクタを追加する

destructor Destroy; override;

このように実装します

destructor Sth.Destroy;
begin
  clock.Free;
  inherited;
end;

clockまた、フィールドを非公開にすることをお勧めします。そのようなクラスの内部を公開するのは良くありません。

TMyClass = class
private
  FClock: TTimer;
  procedure ClockTimer(Sender: TObject);
public
  constructor Create;
  destructor Destroy; override;
end;
....
constructor TMyClass.Create
begin
  inherited;
  FTimer := TTimer.Create(nil);
  FTimer.Interval := 1000;
  FTimer.OnTimer := ClockTimer;
end;

destructor TMyClass.Destroy;
begin
  FTimer.Free;
  inherited;
end;

継承されたコンストラクタとデストラクタへの呼び出しが含まれていることに注意してください。これらはこのクラスから直接派生しTObject、のコンストラクタとデストラクタTObjectが空であるため、このクラスでは必要ありません。ただし、ある時点で継承を変更し、クラスを別のクラスから派生させる場合は、これを行う必要があります。したがって、私の見解では、これらの呼び出しを常に含めることをお勧めします。

于 2012-05-02T12:12:39.500 に答える