Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Countdown funktioniert nicht richtig?! (https://www.delphipraxis.net/119432-countdown-funktioniert-nicht-richtig.html)

BullsEye 26. Aug 2008 14:46


Countdown funktioniert nicht richtig?!
 
Hallo DP'ler,

Also ich habe einen Countdown mit folgendem Code

Delphi-Quellcode:
procedure TForm2.Timer3Timer(Sender: TObject);
VAR
EndDatum : TDateTime;
Aktuell : TDateTime;
Dazwischen : Integer;
Tage, Stunden, Minuten, Sekunden : Integer;
BEGIN
// Countdown
   DateTimePicker1.Time := DateTimePicker2.Time;
   EndDatum := DateTimePicker1.DateTime;
   Aktuell := Now;
   Dazwischen := SecondsBetween(Aktuell, EndDatum);
   Tage := Dazwischen div (60*60*24);
   Dazwischen := Dazwischen - (Tage * 60 * 60 * 24);
   Stunden := Dazwischen div (60*60);
   Dazwischen := Dazwischen - (Stunden * 60 * 60);
   Minuten := Dazwischen div 60;
   Dazwischen := Dazwischen - ( Minuten * 60);
   Sekunden := Dazwischen;
   Form1.Label4.Font.Color := clred;
   Form1.Label4.Caption := Format('%d Tage, %d Stunden, %d Minuten & %d Sekunden bis ' + Edit5.Text + '!', [Tage, Stunden, Minuten, Sekunden]);
IF Dazwischen <= 0 THEN BEGIN // ggf liegt hier der Fehler
IF CheckBox10.Checked THEN BEGIN
sndPlaySound(PChar(ExtractFilePath(ParamStr(0)) + 'Wecker.wav'),SND_ASYNC);
END;
 ShowMessage('Ihr Countdown ist nun beendet! '+ (Edit5.text));
Form1.Label4.Hide;
sndPlaySound(nil,0);
END;
END;
Soweit geht das auch alles. Allerdings wenn ich den Countdown auf 15:46:10 einstelle bekomme ich auch ne Nachricht, das der Countdown beendet sei bei 15:45:10. Sprich er vergleicht die Sekunden?!

Angel4585 26. Aug 2008 14:51

Re: Countdown funktioniert nicht richtig?!
 
versuchs doch mit Abs(Dazwischen)
Edit: quatsch dann geht dir der Zeitpunkt durch die Lappen.. hmm..
hast ma auf >= geprüft?

BullsEye 26. Aug 2008 14:54

Re: Countdown funktioniert nicht richtig?!
 
Zitat:

Zitat von Angel4585
hast ma auf >= geprüft?

Das kann nicht sein. Habs trotzdem getestet und es ist genau das rausgekommen, was ich erwartet habe:
jedes mal, wenn zwischen der aktuellen Zeit und der Zeit bis zum Countdown mehr als 0 Sekunden liegen bekomme ich ne Nachricht "Countdown beendet" Sprich ununterbrochen bekomme ich die Meldung

HenKst 26. Aug 2008 15:01

Re: Countdown funktioniert nicht richtig?!
 
Du ziehst die ganze zeit Tage, Stunden und Minuten von Dazwischen ab
das heisst selbst wenn es noch mehrere tage sind werden sie nicht berücksichtigt

also vergleicht er effektiv tatsächlich nur die sekunden

Schreib dir den Wert von Dazwischen in eine extra variable und frag diese ab, dann sollte es gehn

DeddyH 26. Aug 2008 15:02

Re: Countdown funktioniert nicht richtig?!
 
Ich frage mich, wieso Du immer wieder von "Dazwischen" subtrahierst. Ist das wirklich richtig so?

[edit] Da war ich wohl nicht alleine :lol: [/edit]

Benedikt 26. Aug 2008 15:07

Re: Countdown funktioniert nicht richtig?!
 
Unabhängig davon dass es bestimmt auch anders mit dem "Dazwischen" geht von wegen dem Subtrahieren, du könntest doch auch einfach "Sekunden", "Minuten", etc. auf <=0 überprüfen und nicht nur "Dazwischen" (die Werte hast du ja sowieso)...

Edit: Mhhh...wobei das natürlich das Gleiche ist wie einfach den ursprünglichen Wert von SecondsBetween zu merken :mrgreen:

DeddyH 26. Aug 2008 15:10

Re: Countdown funktioniert nicht richtig?!
 
Ich denke, das geht auch um einiges kürzer. Man subtrahiert die aktuelle Zeit von der eingegebenen und gibt das Ergebnis mit FormatDateTime aus. Ist das Ergebnis <= 0, ist die Endzeit erreicht bzw. überschritten.

BullsEye 26. Aug 2008 15:18

Re: Countdown funktioniert nicht richtig?!
 
Delphi-Quellcode:
procedure TForm2.Timer3Timer(Sender: TObject);
VAR
EndDatum : TDateTime;
Aktuell : TDateTime;
Dazwischen : Integer;
Tage, Stunden, Minuten, Sekunden : Integer;
BEGIN
// Countdown
   DateTimePicker1.Time := DateTimePicker2.Time;
   EndDatum := DateTimePicker1.DateTime;
   Aktuell := Now;
   Dazwischen := SecondsBetween(Aktuell, EndDatum);
   Tage := Dazwischen div (60*60*24);
   Dazwischen := Dazwischen - (Tage * 60 * 60 * 24);
   Stunden := Dazwischen div (60*60);
   Dazwischen := Dazwischen - (Stunden * 60 * 60);
   Minuten := Dazwischen div 60;
   Dazwischen := Dazwischen - ( Minuten * 60);
   Sekunden := Dazwischen;
   Form1.Label4.Font.Color := clred;
   Form1.Label4.Caption := Format('%d Tage, %d Stunden, %d Minuten & %d Sekunden bis ' + Edit5.Text + '!', [Tage, Stunden, Minuten, Sekunden]);
IF (Tage <= 0) AND (Stunden<=0) AND (Minuten<0) AND (Sekunden<=0) THEN BEGIN // <--------------------
IF CheckBox10.Checked THEN BEGIN
sndPlaySound(PChar(ExtractFilePath(ParamStr(0)) + 'Wecker.wav'),SND_ASYNC);
END;
 ShowMessage('Ihr Countdown ist nun beendet! '+ (Edit5.text));
Form1.Label4.Hide;
sndPlaySound(nil,0);
END;
END;
So hab ich das nun aber irgendwie bekomm ich gar keine Meldung mehr?!

Nach DeddyH's Vorschlag:
Delphi-Quellcode:
procedure TForm2.Timer3Timer(Sender: TObject);
VAR
jetzt, ziel, erg : TDateTime;
BEGIN
jetzt := now;
ziel := DateTimePicker1.Date + DateTimePicker2.Time;
erg := ziel - jetzt;
IF erg <= 0 then BEGIN
IF CheckBox10.Checked THEN BEGIN
sndPlaySound(PChar(ExtractFilePath(ParamStr(0)) + 'Wecker.wav'),SND_ASYNC);
END;
 ShowMessage('Ihr Countdown ist nun beendet! '+ (Edit5.text));
Form1.Label4.Hide;
sndPlaySound(nil,0);
end;
end;

Benedikt 26. Aug 2008 17:59

Re: Countdown funktioniert nicht richtig?!
 
Zitat:

Zitat von BullsEye
Delphi-Quellcode:
IF (Tage <= 0) AND (Stunden<=0) AND (Minuten<0) AND (Sekunden<=0) THEN BEGIN // <-------
So hab ich das nun aber irgendwie bekomm ich gar keine Meldung mehr?!

Vermutlich weil Minuten niemals <0 wird ;)

Wobei die Lösung von DeddyH mit FormatDateTime ohnehin viel schöner ist...

MfG Benedikt

rollstuhlfahrer 26. Aug 2008 18:02

Re: Countdown funktioniert nicht richtig?!
 
Zitat:

Zitat von BullsEye
Delphi-Quellcode:
IF (Tage <= 0) AND (Stunden<=0) AND (Minuten<0) AND (Sekunden<=0) THEN BEGIN // <--------------------

Du prüfst netterweise alles auf <=. Und was ist mitr Minuten? Das wird nur auf < geprüft.

Bernhard

EDIT: Na ja, da war einer ohne roten Kasten schneller.
Edit2: Noch ne Frage:

In deinem 1. Code hast du die Zeile:
DateTimePicker1.Time := DateTimePicker2.Time;
Im 2. Code wird daraus:
ziel := DateTimePicker1.Date + DateTimePicker2.Time;
Kann das ein Auslöser für eine nicht vorhandene Meldung sein?

BullsEye 26. Aug 2008 18:35

Re: Countdown funktioniert nicht richtig?!
 
Zitat:

Zitat von Benedikt
Zitat:

Zitat von BullsEye
Delphi-Quellcode:
IF (Tage <= 0) AND (Stunden<=0) AND (Minuten<0) AND (Sekunden<=0) THEN BEGIN // <-------
So hab ich das nun aber irgendwie bekomm ich gar keine Meldung mehr?!

Vermutlich weil Minuten niemals <0 wird ;)

Oo nen Tippfehler :wall: So funktioniert das aber auch!

Zitat:

Zitat von rollstuhlfahrer

In deinem 1. Code hast du die Zeile:
DateTimePicker1.Time := DateTimePicker2.Time;
Im 2. Code wird daraus:
ziel := DateTimePicker1.Date + DateTimePicker2.Time;
Kann das ein Auslöser für eine nicht vorhandene Meldung sein?

Irgendwie bin ich mir das gerade unsicher! Für mich ergibt

Delphi-Quellcode:
DateTimePicker1.Time := DateTimePicker2.Time;
keinen Sinn.
Und zwar aus folgendem Grunde.
DateTimePicker1 wird für das aktuelle Datum genutzt (mehr nicht!)
DateTimePicker2 wird für die aktuelle Uhrzeit genutzt (mehr nicht!)

Also ist es folglich unsinnig, die Zeit vom 1 auf den 2 zuzuweisen!

DeddyH 26. Aug 2008 18:39

Re: Countdown funktioniert nicht richtig?!
 
Dann versuch es mal so:
Delphi-Quellcode:
DateTimePicker1.Time := trunc(DateTimePicker1.Date) + frac(DateTimePicker2.Time);

BullsEye 27. Aug 2008 22:07

Re: Countdown funktioniert nicht richtig?!
 
Zitat:

Zitat von DeddyH
Dann versuch es mal so:
Delphi-Quellcode:
DateTimePicker1.Time := trunc(DateTimePicker1.Date) + frac(DateTimePicker2.Time);

So gehts, danke..
Allerdings ist mir gerade aufgefallen, das der Countdown an sicht immer eine Sekunde zu wenig zählt.
BSP: Countdown endet um 00:00:00 und jetzt haben wir es 23:59:55 das macht ja eine Differenz von 5 Sekunden.
Allerdings wird angezeigt "Nur noch 4 Sekunden". Das ist ansich ja nicht das Problem, das Problem ist, das ich 2x die Nachricht (ShowMessage) erhalte!

EDIT: Trick 17 mit selbstüberlistung. Ich zähle einfach Sekunden+1. Allerdings habe ich dann immernoch 2 Nachrichten! Hier der Code:

Delphi-Quellcode:
procedure TForm2.Timer3Timer(Sender: TObject);
VAR
EndDatum : TDateTime;
Aktuell : TDateTime;
Dazwischen : Integer;
Tage, Stunden, Minuten, Sekunden : Integer;
BEGIN
// Countdown
DateTimePicker1.Time := trunc(DateTimePicker1.Date) + frac(DateTimePicker2.Time);
   EndDatum := DateTimePicker1.DateTime;
   Aktuell := Now;
   Dazwischen := SecondsBetween(Aktuell, EndDatum);
   Tage := Dazwischen div (60*60*24);
   Dazwischen := Dazwischen - (Tage * 60 * 60 * 24);
   Stunden := Dazwischen div (60*60);
   Dazwischen := Dazwischen - (Stunden * 60 * 60);
   Minuten := Dazwischen div 60;
   Dazwischen := Dazwischen - ( Minuten * 60);
   Sekunden := Dazwischen;
   Form1.Label4.Font.Color := clred;
   Form1.Label4.Caption := Format('%d Tage, %d Stunden, %d Minuten & %d Sekunden bis ' + Edit5.Text + '!', [Tage, Stunden, Minuten, Sekunden+1]);
IF (Tage <= 0) AND (Stunden<=0) AND (Minuten<=0) AND (Sekunden<=0) THEN BEGIN
IF CheckBox10.Checked THEN BEGIN
sndPlaySound(PChar(ExtractFilePath(ParamStr(0)) + 'Wecker.wav'),SND_ASYNC);
END;
ShowMessage('Ihr Countdown ist nun beendet! '+ (Edit5.text));
Form1.Label4.Hide;
CheckBox9.Checked := false;
CheckBox10.Checked := false;
sndPlaySound(nil,0);
END;
END;

Blackheart 27. Aug 2008 22:19

Re: Countdown funktioniert nicht richtig?!
 
begin, end

BullsEye 27. Aug 2008 22:33

Re: Countdown funktioniert nicht richtig?!
 
EDIT: Hab den Fehler gefunden! ShowMessage als letztes setzten :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:15 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