Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Timer (https://www.delphipraxis.net/192398-timer.html)

P.A.P. 15. Apr 2017 10:14

Timer
 
Hallo,
ich stell mich gerade richtig dumm an, ich glaube es ist ganz einfach aber ich arbeite das erste mal mit einem Timer.
Und zwar möchte ich einfach nur auf einem Panel eine zeit hochlaufen lassen und zwar mit sekunden und millisekunden. Wenn diese zeit einen wert überschreitet der sich in einem edit befindet, soll die uhr stoppen... Wie stell ich das am einfachsten an???

a.def 15. Apr 2017 10:15

AW: Timer
 
Hast du denn schon irgendwelche Tests die du vorweisen kannst?

P.A.P. 15. Apr 2017 10:18

AW: Timer
 
Im Moment hab ich einen Button der den Timer startet. In dem Timer steht dann folgendes:
procedure TForm1.Timer1Timer(Sender: TObject);
var
zähler: Real;

begin
zähler:=zähler+0.1;
PZeit.caption:=FloatToStr(zähler);
end;

Dann setzt es den Timer aber immer wieder auf 0 zurück und zeigt immer 0.1 an...
und wie man denn stoppt weiß ich noch nicht so ganz

a.def 15. Apr 2017 10:22

AW: Timer
 
Wär das was?

Delphi-Quellcode:

// oben bei private deklarieren:
iMilliSeconds: Integer;
// .....

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Inc(iMilliSeconds, Timer3.Interval);
 Panel1.Caption := IntToStr(iMilliSeconds);

 if iMilliSeconds = 5000 then
  Timer1.Enabled := False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 iMilliSeconds := 0;
 Timer1.Enabled := True;
end;

Der setzt dir "zähler" immer wieder auf 0 zurück, weil "zähler" im Timer selber deklariert ist. Bei jedem Timerdurchlauf gehts dann wieder an den Anfang, also 0.
Die Variable "zähler" (oder wie bei mir iMilliSeconds) muss außerhalb des Timers deklariert werden und darf nur EIN MAL initialisiert (zurückgesetzt) werden. Am besten im Button der auch den Timer startet.

P.S.: wirkliche Millisekunden sind das aber auch nicht. Pro 1000ms die im Panel angezeigt werden kommt es mir so vor, als ob das tatsächlich etwa 1,5 Sekunden wären.

Mavarik 15. Apr 2017 10:27

AW: Timer
 
Zitat:

Zitat von P.A.P. (Beitrag 1367727)
Im Moment hab ich einen Button der den Timer startet. In dem Timer steht dann folgendes:
procedure TForm1.Timer1Timer(Sender: TObject);
var
zähler: Real;

begin
zähler:=zähler+0.1;
PZeit.caption:=FloatToStr(zähler);
end;

Dann setzt es den Timer aber immer wieder auf 0 zurück und zeigt immer 0.1 an...
und wie man denn stoppt weiß ich noch nicht so ganz

Zähler ist eine lokale Variable - Die verliert immer ihren Wert, wenn die Procedure beendet wird... Verschieben Var Zähler:real mal in den private Teil des Forms.

Mavarik

P.A.P. 15. Apr 2017 10:42

AW: Timer
 
Ok also zählen tut es schonmal um das ganze zu stoppen dachte ich mir jetzt folgendes:

procedure TForm1.Timer1Timer(Sender: TObject);
var zeit:real;
begin
zeit:=StrToFloat(Edit2.Text);
zähler:=zähler+0.1;
PZeit.caption:=FloatToStr(zähler);
if zähler=zeit then
begin
Timer1.Enabled:=false;
end;
end;

auch wenn Zähler=zeit ist, führt es die zeile nicht aus...

Olli73 15. Apr 2017 10:48

AW: Timer
 
Zitat:

Zitat von a.def (Beitrag 1367729)
P.S.: wirkliche Millisekunden sind das aber auch nicht. Pro 1000ms die im Panel angezeigt werden kommt es mir so vor, als ob das tatsächlich etwa 1,5 Sekunden wären.

Ein Timer ist viel zu ungenau. Besser du speicherst dir in der Variablen GetTickCount ab und rechnest immer GetTickCount - DieVariable.

P.A.P. 15. Apr 2017 10:52

AW: Timer
 
Danke für den Tipp, aber wie löse ich jetzt das Problem mit dem stoppen des Timers?

Mavarik 15. Apr 2017 11:00

AW: Timer
 
Zitat:

Zitat von P.A.P. (Beitrag 1367736)
auch wenn Zähler=zeit ist, führt es die zeile nicht aus...

if RealA = RealB funktioniert fast nie, da ggf. hintern Komma eine Ungenauigkeit entsteht...

Entweder nimm integer... bei der Ausgabe kannst du ja wieder durch 1000 teilen oder schreibe den if mit ">=".

Zitat:

Zitat von Olli73 (Beitrag 1367737)
Ein Timer ist viel zu ungenau.

Er zählt doch selber... Da ist die Genauigkeit des Timers doch egal!

Olli73 15. Apr 2017 11:01

AW: Timer
 
Zitat:

Zitat von P.A.P. (Beitrag 1367738)
Danke für den Tipp, aber wie löse ich jetzt das Problem mit dem stoppen des Timers?

Entweder du rechnest komplett in Millisekunden (Typ Cardinal, wie es GetTickCount zurückgibt) oder du prüfst einfach mit SameValue(...). Denn bei real und Co darf man nie auf gleich prüfen, da diese Zahlen zu ungenau sind und fast nie z.B. exakt 2.0 ergeben sondern z.B: 2,000....0001.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:41 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz