setTimeout
在JavaScript语言中很有帮助。你会如何在 Delphi 中创建这个函数?
SetTimeOut(procedure (Sender: TObject);
begin
Self.Counter := Self.Counter + 1;
end, 200);
setTimeout
在JavaScript语言中很有帮助。你会如何在 Delphi 中创建这个函数?
SetTimeOut(procedure (Sender: TObject);
begin
Self.Counter := Self.Counter + 1;
end, 200);
5条答案
按热度按时间7hiiyaii1#
我想你可以保持
TTimer
不变,尝试使用SetTimer
函数和它的回调函数。你需要在某个集合中存储定时器ID和它们的(匿名)方法。由于你没有提到你的 Delphi 版本,我使用了一个简单的类和TObjectList
作为集合。原理很简单,您只需调用
SetTimer
函数并指定回调函数,然后使用匿名方法将新示例化的系统计时器ID存储到集合中。当执行回调函数时,通过其ID在集合中找到导致回调的计时器,将其杀死,执行匿名方法并将其从集合中删除。以下是示例代码:简化版( Delphi 2009以上):
正如@大卫的注解所建议的,这里的代码与上面的代码相同,只是在一个单独的单元中使用了泛型字典。这个单元中
SetTimeout
的用法与上面的代码相同:omhiaaxx2#
比如
这是一个刚刚被破解的程序,没有经过任何测试,但它展示了这个概念。基本上,建立一个你想要调用的定时器和过程的列表。当self对象被调用时,它被传递给过程,但是你可以建立第三个列表,其中包含在setTimeout调用中作为参数使用的对象。
然后在呼叫方法之后,借由释放来清除对象。
与javascripts setTimeout不太一样,但它是一个 Delphi 近似值。
附言:我还没有真正从Delphi7中走出来,所以如果在Delphi XE中有一种新的新奇的方法来做这件事,我不知道。
ifsvaxew3#
假设函数每秒被调用一次,而不是5次,如下所示:
还有更复杂的解决方案,比如你接受的那个,为定时器动作取命名对象,并使用SetTimer方法。比如http://code.google.com/p/omnithreadlibrary/source/browse/trunk/tests/17_MsgWait/test_17_MsgWait.pas以前的版本有带匿名函数的SetTimer,但现在没有了。
然而,对于您要求的简单化匿名闭包方法,也许Wait(xxX)适合。
cqoc49vn4#
我通常这样做
vwkv1x7d5#
我实现的OneShotTimer单元,具有跨平台支持,用 Delphi XE8、firemonkey测试