我有一个带有TTimer (timAnimateDataChange)的TFrame (fraDisplay)。定时器用于控制一个小动画。在包含框架的表单中,我希望有一个方法执行以下操作:
procedure TForm.DoStuff;
begin
DoSomeLogicStuff;
fraDisplay.AnimateResult;
WaitForAnimationToFinish;
DoSomeOtherLogicStuff;
fraDisplay.AnimateEndResult;
WaitForAnimationToFinish;
fraDisplay.Finalize;
end;动画基本上是TImage32的重绘,由计时器计时。完成时计时器将自动禁用它,并且帧有一个名为AnimationRunning的布尔值属性,该属性将在动画完成时设置为false。
没有线程或类似的东西来使问题复杂化或帮助问题。
问题是,我如何实现WaitForAnimationToFinish-method?
(顺便说一句,这不是一个好的解决方案:
procedure TForm.WaitForAnimationToFinish;
begin
repeat
Application.ProcessMessages;
until not fraDisplay.AnimationRunning;
end;由于计时器不会在方法运行时触发:-( )
发布于 2009-11-23 03:15:53
Smasher's suggestion可以使用Delphi2009的匿名方法来实现。
procedure TForm.DoStuff;
begin
DoSomeLogicStuff;
fraDisplay.AnimateResult.OnFinished :=
procedure (Sender: TObject)
begin
DoSomeOtherLogicStuff;
fraDisplay.AnimateEndResult.OnFinished :=
procedure (Sender: TObject)
begin
fraDisplay.Finalize;
end;
fraDisplay.AnimateEndResult;
end;
fraDisplay.AnimateResult;
end;顺便说一下:实际上,WaitForAnimationToFinish会让OnTimer触发,因为它使用在调用ProcessMessages时调度的windows消息。但无论如何,这是一个糟糕的想法,因为它使用了大量的CPU,但实际上并不需要它。
发布于 2009-11-23 03:07:34
当计时器禁用自身并将AnimationRunning变量设置为False时,您只需调用下一步应该执行的方法。
发布于 2009-11-23 16:17:14
一位斯诺尼亚的Delphi程序员写的正是你要找的代码-- Active Sleep。
https://stackoverflow.com/questions/1779600
复制相似问题