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




