![]() |
Timer zählt +2 anstatt +1???
Hallo,
ich habe folgendes Problem. Beim Drücken eines Buttons möchte ich, dass in einem Edit Feld die Zeit in Sekunden hochgezählt wird, das heißt es soll langsam von 0 aus an immer nach 1 Sekunde + 1 dazu zählen. Hier mein Code:
Delphi-Quellcode:
Der Timer ist auf ein Intervall von 1000 (also 1 Sekunde) eingestellt, doch wenn ich das Programm laufen lasse, zählt er mir jede Sekunde immer +2 dazu und ich finde den Grund nicht.
timer1.enabled := true;
start := 0; end; procedure TForm1.Timer1Timer(Sender: TObject); begin start := start+1; form2.edit3.text := FloatToStr(start); end; Zudem würde ich gerne wissen, wie ich dann einstellen kann, dass es bei 60 Sekunden dann 1 Minute anzeigt und nach 60 Minuten dann 1 Stunde usw. (also 16:30:10... 16:30:11...16:30:12 usw.) Kann mir da jemand helfen, wäre super!!! Grüße |
Re: Timer zählt +2 anstatt +1???
Du darfst nicht die Zeit mit einem Timer aufaddieren, denn die Timerungenauigkeiten addieren sich im Laufe der Zeit zu grossen Beträgen. (5 Min pro Stunde gut möglich)
Besser Startzeit merken und die Differenz anzeigen:
Delphi-Quellcode:
Das Timer-Interval hat so keinen Einfluss auf die Genauigkeit der Anzeige.
var
StartZeit : TDateTime; // am Besten im private-Abschnitt der Klasse TForm1 ablegen ... StartZeit := Now; end; ... procedure TForm1.Timer1Timer(Sender: TObject); begin form2.edit3.text := TimeToStr(Now- Startzeit); end; Bei Timer-Interval von 5000 wird die Anzeige halt nur alle 5s aktualisiert. |
Re: Timer zählt +2 anstatt +1???
+2? :shock:
Bist du dir sicher? Das kann ich mir überhaupt nicht erklären. Das andere geht übrigens so:
Delphi-Quellcode:
EDIT: @shmia: Das stimmt natürlich, darauf sollte man achten.
var s, m, h: Integer;
//... procedure TForm1.Timer1Timer(Sender: TObject); begin inc(s); //oder s:=s+1; if s>=60 then begin inc(m); s:=0; end; if m>=60 then begin inc(h); m:=0; end; //Hier dann wieder das Edit-Feld: form2.edit1:=inttostr(h)+':'+inttostr(m)+':'+inttostr(s); end; Man deklariert noch eine Variable start, und weißt der am Anfang den Wert von GetTickCount() zu. Die Timer-Methode geht dann wieder so:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var diff: Integer; begin diff:=GetTickCount-start; h:=diff div 60; diff:=diff mod 60; m:=diff div 60; s:=diff mod 60; form2.edit1:=inttostr(h)+':'+inttostr(m)+':'+inttostr(s); end; |
Re: Timer zählt +2 anstatt +1???
Wozu denn dieses Ticks-Integer-div-mod-Gemurkse, wenn es so elegante Wege wie den von shmia gibt :gruebel: ?
|
Re: Timer zählt +2 anstatt +1???
@shmia: super funktioniert einwandfrei :)
habt mir sehr geholfen danke, jetzt werd ich mich noch daran setzen nen button einzufügen wo man die "stoppuhr" anhalten kann und bei einem klicken auf nen anderen Button die Zeit wieder weiterlaufen lassen kann :) Falls mein Projekt fertig ist setz ich es natürlich sofort hier rein :) Grüße |
Re: Timer zählt +2 anstatt +1???
Hallo,
damit die Anzeige einigermaßen synchron zum Takt der Systemuhr läuft, kann man das Interval korrigieren: ![]() Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:33 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