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

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

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

Rob*_*edy 9

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

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

while Integer(GetMessage(Msg, 0, 0, 0)) > 0 do begin
  TranslateMessage(Msg);
  DispatchMessage(Msg);
end;
Run Code Online (Sandbox Code Playgroud)

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


Lie*_*ers 6

除了你创建MyTimer并释放a之外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.
Run Code Online (Sandbox Code Playgroud)

  • 米哈伊尔,我向你保证,单位的使用顺序对你的计划的成功没有影响.问题出在其他地方. (4认同)