我有一个带有 TTimer (timAnimateDataChange) 的 TFrame (fraDisplay)。定时器用于控制一个小动画。在包含框架的表单中,我想要一个方法来做这样的事情:
procedure TForm.DoStuff;
begin
DoSomeLogicStuff;
fraDisplay.AnimateResult;
WaitForAnimationToFinish;
DoSomeOtherLogicStuff;
fraDisplay.AnimateEndResult;
WaitForAnimationToFinish;
fraDisplay.Finalize;
end;
动画基本上是 TImage32 的重绘,由计时器计时。计时器将在完成后自动禁用它,并且该帧有一个名为 AnimationRunning 的 bool 属性,当动画完成时该属性将设置为 false。
没有任何线程或类似的东西会使问题复杂化或帮助问题。
问题是,我如何实现 WaitForAnimationToFinish 方法?
(顺便说一句,这不是一个好的解决方案:
procedure TForm.WaitForAnimationToFinish;
begin
repeat
Application.ProcessMessages;
until not fraDisplay.AnimationRunning;
end;
因为在方法运行时计时器不会触发:-(
)
最佳答案
Smasher's suggestion 可以使用 Delphi 2009 的匿名方法实现。
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 时分派(dispatch)的 Windows 消息。但无论如何,这是一个坏主意,因为它使用了大量 CPU 而实际上并不需要它。
关于delphi - 如何等待计时器完成?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1779600/