2009-11-22 8 views
3

TTimer (timAnimateDataChange)가 포함 된 TFrame (fraDisplay)이 있습니다. 타이머는 작은 애니메이션을 제어하는 ​​데 사용됩니다.TTimer가 끝날 때까지 어떻게 기다려야합니까?

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

애니메이션이가 기본적으로 TImage32의 다시 그리기, 타이머에 의해 시간이 초과 : 프레임을 포함하는 형태로이 같은 일을하는 방법을 갖고 싶어. 완료되면 타이머가 자동으로 비활성화되며 프레임에는 AnimationRunning이라는 부울 속성이 있습니다.이 속성은 애니메이션이 끝날 때 false로 설정됩니다.

문제가 복잡하거나 도움이되는 내용이 없습니다.

질문은 어떻게 WaitForAnimationToFinish 메서드를 구현합니까?

은 (, BTW이 좋은 해결책이 아니다 :

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

방법은 :-(실행되는 동안 타이머가 발생하지 않습니다 때문에)

답변

2

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; 

BTW : 실제로 WaitForAnimationToFinish는 ProcessMessages를 호출 할 때 발송되는 Windows 메시지를 사용하므로 OnTimer를 시작합니다. 그러나 실제적으로 필요없이 많은 CPU를 사용하기 때문에 어쨌든 나쁜 생각입니다.

+0

좋은 제안처럼 들립니다. 불행히도 저는 2007 년에 아직도 있습니다 :-((더 이상, 어쨌든 몇 달 동안) –

+0

이것은 익명의 방법 없이도 작동합니다. 단지 조금 더 많은 코드가 필요합니다 :) –

1

타이머 자체를 불가능하게하고 설정합니다 AnimationRunning 변수를 False으로 변경하면 다음에 실행해야하는 메서드를 호출 할 수 있습니다.

+0

다음에 어떤 메소드를 호출해야하는지 모르겠습니다. 애니메이션을 끝내고 일시 정지해야하는 몇 가지 방법이 있습니다. –

0

타이머가 수행하는 작업은 몇 초 정도의 시간이 걸립니다. 그런 종류의 장기 실행 활동은 주 GUI 루프에서 수행되어서는 안됩니다.

애니메이션이 끝날 때까지 기다리는 동안 (가능한 경우) 나머지 응용 프로그램은 죽은 프로그램처럼 작동합니다. 즉, 어떤 방식 으로든 GUI에 응답하지 않습니다. X 등으로 크기 조정, 다시 그리기, 닫기 등을 할 수 있습니다.

해결 방법은 대신 DoStuff 메서드를 두 개로 분리하는 것입니다. 하나는 타이머 활동을 시작하고, 다른 하나는 타이머가 끝날 때 실행됩니다. 후자를 달성하기 위해, 그 타이머는 작별 인사하기 직전에 두 번째 방법을 호출해야합니다.

라스는 훌륭한 예를 든다. 이 책이 그의 영화와 함께 갈 것으로 생각하십시오 :)

+0

대단히 길지 않습니다. 잠깐. 실제로 독점의 작은 구현입니다.애니메이션은 주사위 애니메이션을 움직이거나 토큰을 움직이는 것과 같은 것들입니다. 멋진 그래픽은없고 캔버스에 텍스트와 컬러 사각형 만 있지만 일정한 양의 애니메이션은 게임의 기분을 좋게 만듭니다. TGame이라는 하나의 개체가 있습니다.이 개체에는 앞서 언급 한 프레임 인 FDisplay라는 속성이 있습니다. 프레임에는 AnimateDieRoll 및 MoveToken과 같은 메서드가 있습니다. –

0

만들기 AnimateResults는 완료 될 때 호출 할 메서드의 매개 변수를 사용합니다.

1

동료 슬로베니아어 델피 프로그래머가 찾고있는 코드를 작성했습니다 : Active Sleep.

관련 문제