2012-01-06 5 views
1

可能性の重複:タイマーが実行されるときに、現在のtimeleftにを取得する方法
Delphi Timer: Time before next eventタイマーでタイムレフトを取得するには?

?例えば

私はその後、私は最初のタイマー

procedure TForm1.second_Timer(Sender: TObject); 
begin 
    second_Timer.Interval := 1000; 
    Label1.Caption := IntToStr(my_Timer.timeleft); // How ??? 
end; 
のtimeleftにを取得することです理由は別のタイマ(インターバル1000)を作成する間隔60 000

procedure TForm1.my_Timer(Sender: TObject); 
begin 
    // do something 
end; 

とタイマーを作成

ありがとうございました。

+0

を使用しています!](http://stackoverflow.com/questions/7263490/delphi-timer-time-before-next-event) – OnTheFly

答えて

4

この情報はタイマーから取得できません。あなたができる最善のことは、タイマーが最後にいつ発砲したのかを記録して、それを自分で解決することです。たとえば、TStopwatchを使用してこれを行うことができます。

+4

しかし、実際のアプリケーションでは、ウィンドウタイマの「予測不可能性」によって、これは間違っている可能性があります。 –

+0

@WarrenPはかなり正しいです –

+0

'Diagnostics'ユニットはいつ追加されましたか? –

0

TTimer自体にはこの機能がありません。 1つのオプションはそうのような残り時間を格納する第一のタイマのタグプロパティを使用することです:

procedure TForm1.MyTimerTimer(Sender: TObject); 
begin 
    MyTimer.Tag := MyTimer.Interval; 
    // Do something 
end; 

procedure TForm1.Second_TimerTimer(Sender: TObject); 
begin 
    MyTimer.Tag := MyTimer.Tag - Second_Timer.Interval; 
    Label1.Caption := 'Time Left '+IntToStr(MyTimer.Tag); 
end; 
+0

タイマーは時間通りに発射することを保証しないので、これはかなり急速に不正確になる可能性があります。自分で時間を記録する方がよいでしょう。 'TStopwatch'で。 –

+0

合意しましたが、それは元のポスターがしようとしているようなタイマーを使用すると常に問題になるでしょう。しかし、これは少なくとも大型タイマーの各インターバルでリセットされるので、連続的にドリフトしません。 –

+0

確かに、ドリフトが2〜2回発生する可能性は否定できないが、より長い大きなタイマーではさらに悪化します。 'TStopwatch'はとても安くて簡単なので、私の見解で使うのが理にかなっています。 –

-2

はちょうど私のハックの道を作成し、私は[ブラッディ繰り返し二つのグローバルVARS

var 
    my_timer_interval_hack : integer; 
    my_timer_timeleft_hack : integer; 

procedure TForm1.my_Timer(Sender: TObject); 
begin 
    // do something 


    // hack, reset timer TimeLeft 
    my_timer_timeleft_hack := my_Timer.Interval; 
end; 



procedure TForm1.second_Timer(Sender: TObject); 
begin 
    second_Timer.Interval := 1000; 

    // hack get timeleft from my_timer 
    my_timer_timeleft_hack := my_timer_timeleft_hack - 1000; 
    if my_timer_timeleft_hack <= 0 then 
    my_timer_timeleft_hack := my_timer.Interval; 

    Label1.Caption := IntToStr(my_timer_timeleft_hack); 
end; 
+0

私が見る限り、あなたは* 1 *グローバル変数のみを使用しています。とにかく、上記のコードは 'Timer1.Interval'または' Timer1を示します。Interval - 1000' ... –

+1

本当に、このためにストップウォッチを使用してください。時間の経過を数えるためにタイマーを使わなければならないという人はいません。 –

+0

なぜ2つのタイマーが必要なのでしょうか? 1つの高解像度とトリガを使う/ 60秒ごとに何かをする.. – Harriv