Delphi-PRAXiS

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

Deadinpac 23. Nov 2005 18:20


Restzeit von einen Countdown
 
Moin,

Ich hoffe der Titel sagt das richtige aus

Es geht um ein Countdown aber ohne tage nur zeit

Also

es gibt 3 Edits ( Edit1 = Std , Edit2 = Min , Edit3 = Sec )

der benutzer gibt jetzt eine Zeit an z.b 3 Std 52 Min 30 Sec und diese zeit soll abgezählt werden

d.h jede Sek zieht Timer1 1 Sek ab // wird wohl jedem klar sein

und sobald Edit1 0 Edit2 0 Edi3 0 anzeigen gibt er Showmessage 'Zeit ist Abgelaufen'

ich habe auch schon viel in DP gesucht aber irgendwie wollen alle mit tage machen oder ich schnall das ned es kann eigentlich ned so schwer sein oder???

Hab auch schon versucht alles in sekunden umzuwandeln und dann timer1 gesagt er soll jede Sek 1 Sek abziehen nur da klappt es irgendwie ned das er mir alles wieder in Std Min und Sek wieder gibt

Hoffe ihr versteht meine Frage *daumdrück*

MFG

Sven

faux 23. Nov 2005 18:26

Re: Restzeit von einen Countdown
 
Hallo!

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Sekunden := Sekunden - 1;
  if Sekunden < 0 then
  begin
    Sekunden := 59;
    Minuten := Minuten - 1;
  end;
  if Minuten < 0 then
  begin
    Minuten := 59;
    Stunden := Stunden - 1;
  end;
  if Stunden < 0 then
  begin
    //ende
  end;
end;
Müsste so ähnlich gehen.

Grüße
Faux

himitsu 23. Nov 2005 18:43

Re: Restzeit von einen Countdown
 
Da die Timer ja bekanntlich nicht die genausten sind, verrechne lieber deine Dauer mit der aktuellsten Uhrzeit - also berechne den Zeitpunkt, wo der Timer ablaufen würde - und dann gib in dem Timer selber immer nur die Restzeit an, damit bekommst du keine Fehler rein.

Beim Start des Timers
Endzeit = aktuelleZeit + Dauer

und bei der Anzeige dann nur noch
Restzeit = Endzeit - aktuelleZeit

malo 23. Nov 2005 18:48

Re: Restzeit von einen Countdown
 
Zitat:

Zitat von himitsu
Da die Timer ja bekanntlich nicht die genausten sind [...]

Sekunden, und auch zehntel Sekunden, sollte der Timer jedoch bei allen gängigen Systemen relativ genau sein. Daher ist dein Lösungsvorschlag IMHO viel zu kompliziert, und überhaupt nicht notwendig ;)

himitsu 23. Nov 2005 19:14

Re: Restzeit von einen Countdown
 
Klar ist die Fehlerrate relativ klein, aber wenn über Stunden hinweg alle 'ner Sekunde ein Fehler eingebaut wird, dann summiert sich dieses aber.

Deadinpac 23. Nov 2005 19:21

Re: Restzeit von einen Countdown
 
Moin,

@faux

ja dein code geht nur das einzige Problem ist das er so zählt 0 -1 58
aber das sollte eigentlich kein drama sein

@himitsu

Gut das du mir das sagst aber in meine Fall muss der Timer ned 100 % genau sein da das für ein spiel ist und ein einfach nur dran erinnern soll wann eine Aktion beendet ist und nachdem er die meldung gelesen hat und das Spiel im Browser aufgerufen hat sollte die Aktion trozdem schon beendet sein.

MFG
Sven

faux 23. Nov 2005 19:26

Re: Restzeit von einen Countdown
 
Zitat:

Zitat von Deadinpac
ja dein code geht nur das einzige Problem ist das er so zählt 0 -1 58
aber das sollte eigentlich kein drama sein

Sorry, Denkfehler.
Einfach nicht auf 59, sondern 60 setzen... ;)

Grüße
Faux

Deadinpac 23. Nov 2005 19:30

Re: Restzeit von einen Countdown
 
Zitat:

Zitat von faux
Zitat:

Zitat von Deadinpac
ja dein code geht nur das einzige Problem ist das er so zählt 0 -1 58
aber das sollte eigentlich kein drama sein

Sorry, Denkfehler.
Einfach nicht auf 59, sondern 60 setzen... ;)

Grüße
Faux

ne jetzt zählt er so 0 -1 59 ^^

MFG
sven

Deadinpac 23. Nov 2005 22:16

Re: Restzeit von einen Countdown
 
Moin,


Wenn jmd den Fehler weiss warum er jetzt 0 -1 59 zählt

bitte posten interessieren würde mich das doch schon mal

ich hab auch schon mit ' = 0 , <= 0 , < 1 'aber da macht er es auch ned :coder2:

naja ich geh erstmal ins Bett vllt komm ich ja morgen drauf d.h wenn es niemand von euch weiss^^

MFG
Sven

himitsu 23. Nov 2005 22:40

Re: Restzeit von einen Countdown
 
das von faux scheint mir erstmal richtig.
Zeig mal, wie du es genau bei dir implementiert hast.

faux 24. Nov 2005 06:49

Re: Restzeit von einen Countdown
 
Ich verstehe nicht genau was du meinst. Ich dachte er zählte vor meinem Korrekturpost so:
Code:
00:13:03 - 00:13:02 - 00:13:01 - 00:13:00 - 00:12:60 - 00:12:59 - 00:12:58
und dann hast du geschrieben
Zitat:

Zitat von Deadinpac
ne jetzt zählt er so 0 -1 59 ^^

Also habe ich angenommen, dass er so zählt:
Code:
00:13:03 - 00:13:02 - 00:13:01 - 00:13:00 - 00:12:59 - 00:12:58 - 00:12:57
Und so ist das ja ok, oder?

Grüße
Faux

Deadinpac 24. Nov 2005 19:56

Re: Restzeit von einen Countdown
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin,

ne mom zählt er so 00:13:01 - 00:13:-1 - 00:12:59

und vorher hat er so gezählt 00:13:01 - 00:13:-1 - 00:12:58

Aber ihr könnt euch selber überzeugen

wenn ihr es dann besser versteht was ich meine

Aber ned erschrecken wenn da noch ein paar variabeln sind die noch ned benutzt sind die muss ich noch rausnehmen

MFG
Sven

Amateurprofi 24. Nov 2005 20:43

Re: Restzeit von einen Countdown
 
so müßte es funktionieren

Delphi-Quellcode:
var endtime:TDateTime;

procedure TMain.Button1Click(Sender: TObject);
begin
   endtime:=Now+EncodeTime(StrToInt(Edit1.Text),StrToInt(Edit2.Text),
                                 StrToInt(Edit3.Text),0);
   Timer1.Interval:=500; // nicht 1000
   Timer1.Enabled:=true;
end;

procedure TMain.Timer1Timer(Sender: TObject);
var hh,mm,ss,ms:word; timetoend:TDateTime;
begin
   timetoend:=endtime-Now;
   if timetoend<0 then timetoend:=0;
   DecodeTime(timetoend,hh,mm,ss,ms);
   Edit1.Text:=IntToStr(hh);
   Edit2.Text:=IntToStr(mm);
   Edit3.Text:=IntToStr(ss);
   if timetoend>0 then exit;
   Timer1.enabled:=false;
   ShowMessage('Deine Zeit ist abgelaufen.');
end;

faux 24. Nov 2005 21:06

Re: Restzeit von einen Countdown
 
Zitat:

Zitat von Deadinpac
Moin,
ne mom zählt er so 00:13:01 - 00:13:-1 - 00:12:59
und vorher hat er so gezählt 00:13:01 - 00:13:-1 - 00:12:58
Aber ihr könnt euch selber überzeugen
wenn ihr es dann besser versteht was ich meine
Aber ned erschrecken wenn da noch ein paar variabeln sind die noch ned benutzt sind die muss ich noch rausnehmen
MFG
Sven

Denke mal, du hast die Variablen nicht inizialisiert, oder?

Deadinpac 25. Nov 2005 20:11

Re: Restzeit von einen Countdown
 
Zitat:

Zitat von faux
Zitat:

Zitat von Deadinpac
Moin,
ne mom zählt er so 00:13:01 - 00:13:-1 - 00:12:59
und vorher hat er so gezählt 00:13:01 - 00:13:-1 - 00:12:58
Aber ihr könnt euch selber überzeugen
wenn ihr es dann besser versteht was ich meine
Aber ned erschrecken wenn da noch ein paar variabeln sind die noch ned benutzt sind die muss ich noch rausnehmen
MFG
Sven

Denke mal, du hast die Variablen nicht inizialisiert, oder?

@ Faux

Ich habe ja nicht deine variabeln benutzt ich hab sie eben abgeändert wie ich sie brauche.

@ Amateurprofi

Ja dein Code geht auch

Nur was mir aufgefallen ist nach den man auf Start klickt laufen die ersten beiden sekunden zu schnell ab und erst dann läuft er normal.

MFG
Sven

Amateurprofi 28. Nov 2005 04:04

Re: Restzeit von einen Countdown
 
Hallo Sven,
bei mir laufen auch die ersten Sekunden normal.
Was passiert denn in dem Programm?:
1) Bei Button1Click werden die Stunden, Minuten, Sekunden aus den Edit Feldern geholt,
in TDateTime umgewandelt. Das Ergebnis wird zum aktuellen Datum.Zeit addiert und in
endtime gespeichert.
Dann wird der Timer auf ein Intervall von 1/2 Sekunde gestellt und enabled auf true gesetzt.
Also sollte Timer1Timer jede 1/2 Sekunde aufgerufen werden.
2) Bei Timer1Timer wird dann die Differenz zwischen endtime und aktueller Zeit, also die Restzeit
in Stunden, Minuten, Sekunden umgewandelt und in die Edit Felder gestellt.
Wenn nun die ersten Sekunden bei Dir schneller ticken, dann fallen mir nur zwei mögliche Ursachen ein
(a) der Timer läßt sich in den ersten Sekunden etwas mehr Zeit
(b) die Uhr geht falsch.
Bedenke :
Das Programm zählt nicht die hh,mm,ss runter sondern berechnet bei jedem Timer Event die Restzeit neu.
Vielleicht solltest Du mit dem QueryPerformanceCounter arbeiten. Ist etwas aufwendiger, sollte aber exakter laufen.
Gruß, Klaus


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