3

TTimer(timAnimateDataChange)を備えたTFrame(fraDisplay)があります。タイマーは、小さなアニメーションを制御するために使用されます。フレームを含むフォームで、次のようなメソッドが必要です。

procedure TForm.DoStuff;
begin
   DoSomeLogicStuff;
   fraDisplay.AnimateResult;
   WaitForAnimationToFinish;
   DoSomeOtherLogicStuff;
   fraDisplay.AnimateEndResult;
   WaitForAnimationToFinish;
   fraDisplay.Finalize;
end;

アニメーションは基本的にTImage32の再描画であり、タイマーによって計時されます。タイマーは終了時にそれ自体を無効にし、フレームにはAnimationRunningと呼ばれるブールプロパティがあり、アニメーションが終了するとfalseに設定されます。

問題を複雑にしたり助けたりするスレッドなどはありません。

問題は、WaitForAnimationToFinishメソッドをどのように実装するかです。

(ところで、これは良い解決策ではありません:

procedure TForm.WaitForAnimationToFinish;
begin
  repeat 
    Application.ProcessMessages;
  until not fraDisplay.AnimationRunning;
end;

メソッドの実行中はタイマーが起動しないため:-()

4

5 に答える 5

2

Smasher の提案は、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 を呼び出すときにディスパッチされる Windows メッセージを使用するためです。しかし、実際にはそれを必要としないのに大量の CPU を使用するため、とにかく悪い考えです。

于 2009-11-22T19:15:53.333 に答える
1

タイマーがそれ自体を無効にし、AnimationRunning変数をFalseに設定すると、次に実行する必要があるメソッドを呼び出すことができます。

于 2009-11-22T19:07:34.407 に答える
1

仲間のスロベニアの Delphi プログラマーが、まさにあなたが探しているコードを書きました - Active Sleep

于 2009-11-23T08:17:13.510 に答える
0

AnimateResultsに、実行時に呼び出されるメソッドのパラメーターを取得させます。

于 2009-11-22T22:23:50.393 に答える
0

では、タイマーが行っていることは、数秒程度の長いものですか? いずれにせよ、この種の長時間実行されるアクティビティは、メインの GUI ループで実行されるべきではありません。そのようなものを待つべきではありません:

アニメーションが終了するのを待っている間 (可能であれば)、アプリケーションの残りの部分は死んだプログラムのように動作します。つまり、サイズ変更、再描画、X. .

解決策は、代わりに DoStuff メソッドを 2 つに分割することです。1 つはタイマー アクティビティを開始し、もう 1 つはタイマーが終了したときに実行されます。後者を達成するには、そのタイマーは、別れを告げる直前に 2 番目のメソッドを呼び出す必要があります。

Lars は素晴らしい例をまとめてくれました。これは彼の映画に合う本だと考えてください:)

于 2009-11-22T19:18:32.340 に答える