Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Countdown (https://www.delphipraxis.net/70982-countdown.html)

ByStones2 7. Jun 2006 15:46


Countdown
 
Hi,

ich würde gern einen Countdown von 9,9s zu null machen, wenn er bei null angelangt ist, soll er wieder bei 9,9 beginnen.
Das ganze soll eine unedlichkeitsschleife werden.
Mein Code geht nur nicht, denn er geht ins minus statt von 9,9 zu beginnen:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if timetoharvest <> 0.0 then
begin
timetoharvest := timetoharvest - 0.1;
Label5.Caption := floattostrf(timetoharvest,ffnumber,8,1)+' s';
end
else
timetoharvest := 9.9;
end;

mquadrat 7. Jun 2006 15:53

Re: Countdown
 
Mach doch aus dem
Delphi-Quellcode:
if timeToHarvest <> 0
ein
Delphi-Quellcode:
if timeToHarvest > 0
Das würde doch für deine Zwecke langen denke ich. Grund für das Scheitern ist wahrscheinlich die "Ungenauigkeit" von float-Werten.

sgmeiner 7. Jun 2006 15:54

Re: Countdown
 
Einfachste Lösung scheint mir die zu sein:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if timetoharvest >= 0.0 then
begin
timetoharvest := timetoharvest - 0.1;
Label5.Caption := floattostrf(timetoharvest,ffnumber,8,1)+' s';
end
else
timetoharvest := 9.9;
end;
Einen Vergleich mit Floats durchzuführen wird auf selten gelingen, da die intern nie exakt 0.0 sein werden sondern für die CPU immer was krummes wie 0.000000000521 dargstellen.

ByStones2 7. Jun 2006 16:02

Re: Countdown
 
Zitat:

Zitat von sgmeiner
Einfachste Lösung scheint mir die zu sein:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if timetoharvest >= 0.0 then
begin
timetoharvest := timetoharvest - 0.1;
Label5.Caption := floattostrf(timetoharvest,ffnumber,8,1)+' s';
end
else
timetoharvest := 9.9;
end;
Einen Vergleich mit Floats durchzuführen wird auf selten gelingen, da die intern nie exakt 0.0 sein werden sondern für die CPU immer was krummes wie 0.000000000521 dargstellen.

OK, dann muss es halt ein bisschen verzögert sein, dann ist aber das ganze prinzip kaputt, weil es die Zeit bis zur Ernte anzeigen soll, und wenn sich das dann immer und 0,0000000521 verschiebt, dann sind das nach 1000 Ernten auch 0,0000521000 sekunden und dazu kommt noch, dass die Erntezeit durch arbeiter um jeweils 0,1 sekunden verkürzt wird, wobei es aber maximal 10 Arbeiter sein können.
Das ganze muss ich mit einplanen.
Könnte man vielleicht es so machen, dass sich die Zahl alle 9,9 sekunden mit dem interval von GeldTimer abstimmt ????
Die Variable für arbeiter heißt arbeiter ...

Die Muhkuh 7. Jun 2006 16:09

Re: Countdown
 
Benutz halt keine Kommazahlen ;)

Statt mit 9.9 nimmst du halt 99 und ziehst immer 1 ab.

ByStones2 7. Jun 2006 16:14

Re: Countdown
 
Zitat:

Zitat von Spider
Benutz halt keine Kommazahlen ;)

Statt mit 9.9 nimmst du halt 99 und ziehst immer 1 ab.

könntest du mir bitte den quelltext posten

Die Muhkuh 7. Jun 2006 16:26

Re: Countdown
 
Hmm,

Delphi-Quellcode:
// Deins:
// TimeToHarvester: Double; // Oder ähnlich

// Meins
  TimeToHarvester: Integer;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if timetoharvest >= 0 then
begin
timetoharvest := timetoharvest - 1;
Label5.Caption := floattostrf(timetoharvest / 10,ffnumber,8,1)+' s';
end
else
timetoharvest := 99;
end;
o.Ä.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:53 Uhr.

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