5

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