我有一个带有 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/

10-11 22:26
查看更多