![]() |
Timer-Problem
Ich habe da ein kleines problem mit einem Timer.
Undzwar läuft eine Zeit herunter, wenn diese "10" sekunden restzeit hat passiert folgendes:
Delphi-Quellcode:
iMins + iSecs ist im Format 00:00:00 in einem Label gespeichert, welches sich dann eigentlich "erneuern" sollte.if iMins + iSecs = 10 then // iMins und iSecs enthält bei 00:02:20 z.b. zusammen: 140. (2* 60 Sek + 20) begin S := '00:00:00'; UpdateList; end; end; Manchmal tut es ds aber nicht (das ist nicht das Problem) => das Problem ist eher, dass der Timer dann "hoch-zählt". Wie kann ich das abfangen? Edit// nurnochmal zur ausführlichen Erklärung: LabelX wird mit der aktuellen uhrzeit vergleichen und der Zeitraum dazwischen ist das interval des Timers. "normal" ändert sich das Label mit der Uhrzeit alle Paar Minuten, manchmal jedoch nicht, und dann ist der Zeitraum von 12:00:00 (jetzt) und dem Label 11:55:00 ungleich, deswegen zählt der ja hoch. |
Re: Timer-Problem
Sorry, ich habe nix verstanden, von dem was du geschrieben hast...
Was willst du eigentlich machen? |
Re: Timer-Problem
Ganz verstanden habe ich es zwar nicht, aber Du solltest zum Einen die Logik von der Darstellung trennen ("in einem Label gespeichert"... *brrr*) und zum Zweiten keinen direkten Vergleich machen, sondern nachsehen, ob die Untergrenze unterschritten wurde, d.h. nicht auf Gleichheit, sondern auf kleiner/größer (je nach Logik) oder gleich abfragen.
|
Re: Timer-Problem
"d.h. nicht auf Gleichheit, sondern auf kleiner/größer"
Ok, ich habe es jetzt so gelöst. Die Aktuelle Uhrzeit im Format HH:MM:SS habe ich folgendermaßen in eine Integer-Variable geladen: HHMMSS. Die Ziel-Uhrzeit habe ich genau so in eine Integer-Variable gepackt. Dann vergleiche ich so:
Delphi-Quellcode:
Ich kenne die Regeln der Programmierung nicht genau, aber ist das in Ordnung so?
if StrToInt(timeComplNow) > StrToInt(timeComplThen) then // nicht >=
begin UpdateList; SetColour; end; |
Re: Timer-Problem
Das sieht mir etwas umständlich aus. Kannst Du noch einmal genauer beschreiben, was Du genau machen möchtest?
|
Re: Timer-Problem
Ok.
Auf meinem Forumla läuft oben rechts die aktuelle Uhrzeit an. Etwas weiter unten, in einer Liste, steht eine Zeit in der Zukunft. Etwa so könnte man es verdeutlichen:
Delphi-Quellcode:
So, ist die Jetztige Zeit größer als die Zeit in der Zukunft, zählte der Timer eben noch hoch.
---------------------
| 12:24:00 | // Jetzt | | | | | | | 12:26:00 | // Später |Noch 00:02:00 Min | // Restzeit --------------------- Was ich aber durch meinen letzten Post gelöst hatte. |
Re: Timer-Problem
Liste der Anhänge anzeigen (Anzahl: 1)
Du willst also die Zeit im Sekundentakt oben im formular hochlaufen lassen, bis es 12:26 ist, wie sie unten in der Liste steht. Dann hätt ich jetzt mal dein Problem verstanden, oder?
Zeiten (und Datum) speichert man in Delphi in TDateTime Typen, dazu brauchst du also nicht umständlich irgendwelche Strings auseinande zu pflücken oder Stunden und Minuten zu extrahieren. Ich würde 2 Properties definieren, welche deine beiden Zeiten beinhalten (Jetzt und BisZeit). In der Setter-Methode kannst du z.B. deine Darstellung aktualiseren. Somit brauchst du nirgends, ausser in der Setter-Methode, deine Labels anzufassen, und arbeitest ausschliesslich mit deinen Eigenschaften.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; lblJetzt: TLabel; lblBisZeit: TLabel; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); private FJetzt: TDateTime; FBisZeit: TDateTime; procedure SetJetzt(const Value: TDateTime); procedure SetBisZeit(const Value: TDateTime); { Private-Deklarationen } public { Public-Deklarationen } property Jetzt : TDateTime read FJetzt write SetJetzt; property BisZeit : TDateTime read FBisZeit write SetBisZeit; end; var Form1: TForm1; implementation {$R *.dfm} { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin Jetzt := Now ; BisZeit := Jetzt + EncodeTime(0,0,5,0); timer1.Enabled := true; end; procedure TForm1.SetBisZeit(const Value: TDateTime); begin FBisZeit := Value; lblBisZeit.Caption := TimeToStr(FBisZeit) ; end; procedure TForm1.SetJetzt(const Value: TDateTime); begin FJetzt := Value; lblJetzt.Caption := TimeToStr(FJetzt) ; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Jetzt := Now ; if (Jetzt >= BisZeit) then begin timer1.Enabled := false; ShowMessage ('Countdown abgelaufen') ; end; end; end. |
Re: Timer-Problem
" Du willst also die Zeit im Sekundentakt oben im formular hochlaufen lassen, bis es 12:26 ist, wie sie unten in der Liste steht. Dann hätt ich jetzt mal dein Problem verstanden, oder? "
Ne :D Ich will nur die Zeit die OBEN steht mit der unten vergeichen ;) Das klappt ja auch. Das Problem war halt nur, dass wenn die Zeit oben über der Zeit unten war, der Timer (welcher eigentlich ein Countdown ist hoch statt runtergezähl hat. |
Re: Timer-Problem
Zitat:
iMins + iSecs = 10 gilt auch für 10 min 0 sec, oder 9 min 1 sec ... = krasser Logikfehler. Gruss Reinhard |
Re: Timer-Problem
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz