TTimer对象可以是Delphi类的字段吗?

时间:2012-05-02 12:03:43

标签: delphi

两天前我开始学习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 

但我认为这不是问题。是否有可能创建我想要的课程?

1 个答案:

答案 0 :(得分: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的构造函数和析构函数为空。但是如果你在某个时候更改了继承,并使你的类派生自另一个类,那么你需要这样做。因此,在我看来,最好始终包含这些调用。