You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Delphi模拟JavaScript setTimeout():运行时创建TTimer编译报错求助

解决Delphi中模拟setTimeout的Timer编译问题

嘿,我帮你看看这段代码的问题哈,没法编译主要是事件绑定的方式错了,还有几个小细节没处理到位,我一步步给你修正:

问题排查

  • 事件赋值错误t.OnTimer := goTimer(t);这行是直接调用了goTimer方法,而不是把方法的地址绑定到OnTimer事件上。Delphi里事件是方法指针,直接写方法名就行,不用加括号传参。
  • 未启用Timer:创建Timer后默认是禁用状态,必须手动设置Enabled := True,它才会开始计时。
  • 小细节优化:释放Timer前最好先停止它,避免触发多次事件。

修正后的完整代码

procedure createAndRunTimer();
procedure goTimer(Sender: TObject);
var
  LTimer: TTimer;
begin
  LTimer := Sender as TTimer;
  LTimer.Enabled := False; // 先停止计时,防止重复触发
  // 这里写你要延迟执行的操作
  ShowMessage('延迟5秒后的操作执行了!');
  LTimer.Free; // 释放Timer
end;
var 
  t : TTimer;
begin
  t := TTimer.Create(frmprinc);
  t.Interval := 5000; // 5000毫秒=5秒
  t.OnTimer := goTimer; // 正确绑定事件,直接传方法名
  t.Enabled := True; // 启用Timer开始计时
end;

补充说明

  • 我在goTimer里加了局部变量LTimer,把Sender转成TTimer后存起来,既避免了多次类型转换,代码也更清晰。
  • 因为你把frmprinc作为Timer的Owner,就算不手动Free,窗体销毁时也会自动释放它,但手动释放更符合一次性Timer“用完就清”的习惯。

内容的提问来源于stack exchange,提问作者delphirules

火山引擎 最新活动