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

xan*_*xan 5 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;
Run Code Online (Sandbox Code Playgroud)

我的类似代码复制,但它无法正常工作.当我调用构造函数时,程序崩溃了(在行的访问冲突:clock.interval:= 1000;).我不知道是什么

Sender:TObject 
Run Code Online (Sandbox Code Playgroud)

但我觉得这不是问题.是否有可能创建我想要的课程?

Dav*_*nan 12

您尚未创建计时器.声明变量是不够的.您需要创建计时器.

constructor Sth.Create()
begin
  clock := TTimer.Create(nil);
  clock.interval:=1000;
  clock.OnTimer := clockTimer;
end;
Run Code Online (Sandbox Code Playgroud)

你也应该销毁它.在类中添加析构函数

destructor Destroy; override;
Run Code Online (Sandbox Code Playgroud)

并像这样实现它

destructor Sth.Destroy;
begin
  clock.Free;
  inherited;
end;
Run Code Online (Sandbox Code Playgroud)

我还建议你让你的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;
Run Code Online (Sandbox Code Playgroud)

请注意,我已经包含对继承的构造函数和析构函数的调用.这些在本类中不是必需的,因为它直接派生TObject而构造函数和析构函数为TObject空.但是如果你在某个时候更改了继承,并使你的类派生自另一个类,那么你需要这样做.因此,在我看来,总是包含这些调用是一种好习惯.

  • 构造函数接收名为Owner的类型为TComponent的参数.如果你的类派生自`TComponent`那么它可以通过`Self`然后你的实例将*拥有*计时器.这意味着计时器将在其所有者被销毁时自动销毁.这在VCL中广泛使用.这里不需要它,所以你通过`nil`选择退出所有权机制. (3认同)