我需要一个“无形式”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 过程永远不会运行。我真的很感激为什么: - )
答案 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)行并运行您的应用程序。确保计时器是在您想要的时候创建的,而不是过早销毁。