Delphi:我自己的Timer的OnTimer事件永远不会发生

时间:2010-04-14 06:09:00

标签: delphi timer delphi-7

我需要一个“无形式”Delphi单元中的 Timer (还有一个带有表单的主单元),所以我这样做:

unit ...

interface

type
  TMyTimer = Class(TTimer)
  public
    procedure OnMyTimer(Sender: TObject);
  end;

var
  MyTimer: TMyTimer;

implementation

procedure TMyTimer.OnMyTimer(Sender: TObject);
begin
  ...
end;

initialization

MyTimer := TMyTimer.Create(nil);
with MyTimer do
begin
  Interval := 1000;
  Enabled := True;
  OnTimer := OnMyTimer;
end;

finalization

FreeAndNil(MyTimer);

问题是 OnMyTimer 过程永远不会运行。我真的很感激为什么: - )

3 个答案:

答案 0 :(得分:9)

为了让计时器工作,您的程序必须处理消息。在GUI程序中,该部分是自动的; TApplication课程为您提供。但是你说你有一个“没有形式”的程序,所以我想你可能没有在你的DPR文件中调用Application.Run

要使用计时器,您需要处理消息。消息泵的典型起点是这样的代码:

while Integer(GetMessage(Msg, 0, 0, 0)) > 0 do begin
  TranslateMessage(Msg);
  DispatchMessage(Msg);
end;

当计时器的周期结束时,操作系统会有效地在程序的消息队列中放置wm_Timer消息。 GetMessage调用从队列中获取消息,DispatchMessage调用目标窗口的窗口过程。 TTimer为自己创建了一个隐藏窗口,作为这些消息的目标,DispatchMessage确保它们到达那里。

答案 1 :(得分:6)

除了您创建MyTimer并释放MouseTimer之外,我没有发现您的代码有任何问题(我假设您在GUI应用程序中使用您的代码或至少有一个消息循环)

此代码示例适用于Delphi 5. 每秒都会将Hello World get写入事件日志。

unit Unit2;

interface

uses
  extctrls;

type
  TMyTimer = Class(TTimer)
  public
    procedure OnMyTimer(Sender: TObject);
  end;

var
  MyTimer: TMyTimer;

implementation

uses
  windows, sysutils, classes;

procedure TMyTimer.OnMyTimer(Sender: TObject);
begin
  OutputDebugString(PChar('Hello World'));
end;

initialization

MyTimer := TMyTimer.Create(nil);
with MyTimer do
begin
  Interval := 1000;
  Enabled := True;
  OnTimer := OnMyTimer;
end;

finalization
  FreeAndNil(MyTimer);

end.

答案 2 :(得分:1)

您的单位是否被其他单位使用?如果其他人不使用本机,它甚至不会进入初始化部分。或者也许你认为这个单位很快就会完成。

在MyTimer上放置一个断点:= TMyTimer.Create(nil);行和FreeAndNil(MyTimer)行并运行您的应用程序。确保计时器是在您想要的时候创建的,而不是过早销毁。