Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Silvester Countdown (https://www.delphipraxis.net/59837-silvester-countdown.html)

netscanner 29. Dez 2005 12:17


Silvester Countdown
 
Hallo Leute, kurz vor Ende des Jahres habe ich noch eine Frage.

Ich möchte für unsere Silvesterparty einen Countdown entwickeln, der in Edit Feldern o.Ä. die Zeit runterzählt bis auf 0 Uhr 0 und 0 Sekunden am 01.01.2006.

Bitte helft mir dabei :)





Gruß und einen guten Rutsch
Martin

faux 29. Dez 2005 12:20

Re: Silvester Countdown
 
Hallo!

Wo genau liegt denn das Problem?
Beim Runterzählen oder beim Zeit ermitteln oder... ?
Benutze mal die Forums-Suche: Hier im Forum suchenCountdown. Ich kann mich erinnern, dass sowas vor kurzem gefragt und gelöst wurde.

Grüße
Faux

Nachtrag: http://www.delphipraxis.net/internal...ight=countdown

netscanner 29. Dez 2005 12:23

Re: Silvester Countdown
 
Ja das habe ich schon gemacht, das Problem liegt bei Runterzählen....
und zeit ermitteln könnte man auch nochmal drauf eingehen.
das programm soll also wirklich wie eine Uhr funktionieren nur rückwärts und nicht irgendwie auf button klick die verbliebene zeit anzeigen (das wäre kein problem....)

100nF 29. Dez 2005 12:26

Re: Silvester Countdown
 
Zitat:

das programm soll also wirklich wie eine Uhr funktionieren nur rückwärts und nicht irgendwie auf button klick die verbliebene zeit anzeigen (das wäre kein problem....)
na, wenn das kein problem ist, wiso machst du es nicht genauso, und fügst einen timer hinzu, der alle sekunden diesen button-klick simuliert?

netscanner 29. Dez 2005 12:29

Re: Silvester Countdown
 
weil genau DAS das Problem ist...
Ich weiß die Timer funktion nicht, die jede sekunde das machen soll...

100nF 29. Dez 2005 12:31

Re: Silvester Countdown
 
also du fügst den timer auf die form, normalerweise ist er dann gerade auf 1000 ms eingestellt, das du so lassen kannst.
das einzige was du noch machen musst, ist dem timer das onTimer-ereignis zuzufügen. du kannst auch einen doppelklick auf den timer machen, und dann den code zum berechen zwischen begin und end einfügen.

faux 29. Dez 2005 12:32

Re: Silvester Countdown
 
Zitat:

Zitat von netscanner
und zeit ermitteln könnte man auch nochmal drauf eingehen.

Delphi-Quellcode:
var
  Zeit: TSystemTime;
begin
  GetSystemTime(Zeit);
end;
Ein Timer löst alle x-Millisekunden das OnTimer-Ereignis aus. x ist dabei das Intervall.

Grüße
Faux

NACHTRAG:
Kann mir einer erklären, warum ich nicht einfach nur now geschrieben habe? :mrgreen:

netscanner 29. Dez 2005 12:39

Re: Silvester Countdown
 
okey danke...noch eine kleine frage:

wie würde ich die system zeit in einem edit feld anzeigen.
habs jetzt einfach mit

edit1.text := zeit ;



versucht, damit geht's aber nicht.

dahead 29. Dez 2005 12:44

Re: Silvester Countdown
 
wenn du Zeit vom Typ TDateTime deklariert hast, kannst du via DateToStr(Now) die aktuelle Zeit als String anzeigen lassen.

JWeis 29. Dez 2005 12:48

Re: Silvester Countdown
 
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  Zeit: TDateTime;
begin
  //zeit ist dein countdown
  Panel1.Caption:=DateTimeToStr(zeit);
end;
ich würde es anzeigen lassen

Thanatos81 29. Dez 2005 12:59

Re: Silvester Countdown
 
Und setz den Interval vom Timer am besten auf 999, da der Timer ab und an nicht 100%ig genau geht, kann es sont in seltenen Fällen dazu kommen, dass eine Sekunde übersprungen wird.

faux 29. Dez 2005 18:45

Re: Silvester Countdown
 
Zitat:

Zitat von Thanatos81
Und setz den Interval vom Timer am besten auf 999, da der Timer ab und an nicht 100%ig genau geht, kann es sont in seltenen Fällen dazu kommen, dass eine Sekunde übersprungen wird.

Selbst wenn der Timer genau ginge, kann es zu diesem Vorfall kommen, da der Timer höchstwarscheinlich nicht genau zum Wechsel einer Sekunde gestartet wird.
Aber nachdem du nicht mithilfe des Timers zählst, sondern die Zeit jedes mal neu ausliest, sollte dies kein großer faux-pas sein. ;)

Grüße
Faux

gfjs 30. Dez 2005 04:34

Re: Silvester Countdown
 
Guten Morgen, allerseits.

Ich bin noch Anfänger und sitze momentan im Büro, wo ich kein Delphi installiert habe. Deshalb kann ich meinen Lösungsvorschlag nicht ausprobieren. Ich könnte mir aber folgende Lösung vorstellen:

Zielzeitpunkt ist 1.1.2006, also Neujahr := EnCodeDateTime(2006,1,1,0,0,0,0);
Mit "Now" erhalte ich die momentane Zeit, z.B. 31.12.2005 - 18:00:00
CountDown := Neujahr - Now sollte dann die Zeit bis Neujahr ergeben und Panel1.Caption := DecodeTime(CountDown) die Zeit bis zum Jahreswechsel anzeigen.

Ich hoffe, das funktioniert so.

mfg gfjs

100nF 30. Dez 2005 08:34

Re: Silvester Countdown
 
hi,

genau so würde ich es auch machen.

Und den ganzen code den es dann gibt, musst du nur noch ins onTimer Ereignis von einem Timer reinschreiben.

wenn du es genau haben willst, kannst du ja der intervall auf 1 oder auf 10 stellen, aber immer ein teiler von 1000, sonst könnte es dann doch ziemlich abweichen.

was du natürlich auch noch beachten musst, ist, die systemzeit sehr genau einzustellen, sonst nützt auch der kleinste inervall vom timer nichts...

gruss
urbanbruhin

kobel 30. Dez 2005 08:51

Re: Silvester Countdown
 
netscanner,

wenn du möchtest schicke ich dir den code für mein countdownprojekt

gruß
kobel

alzaimar 30. Dez 2005 08:54

Re: Silvester Countdown
 
Zitat:

Zitat von urbanbruhin
...wenn du es genau haben willst, kannst du ja der intervall auf 1 oder auf 10 stellen, aber immer ein teiler von 1000, sonst könnte es dann doch ziemlich abweichen.

was du natürlich auch noch beachten musst, ist, die systemzeit sehr genau einzustellen, sonst nützt auch der kleinste inervall vom timer nichts...

Entschuldige bitte, aber das ist Quark^3.
Wenn ich im Timer-Ereignis immer die Differenz zwischen '1.1.2006 00:00:00' und Jetzt anzeige, ist es absolut egal, wie genau die Systemzeit ist, und wie ich das Timerinterval einstelle, solange es < 1000 ist. Es wird dann garantiert jede Sekunde mindestens einmal die Zeit abgefragt.

Wie zeige ich die Differenz an?
Delphi-Quellcode:
Function RemainingTime(aStart, aStop: TDateTime): String;
Var
  iSeconds, iMins, iHrs, iDays: Int64;

Begin
  iSeconds := Trunc(0.5 + (aStop - aStart) * 86400); // Erstmal Sekunden ausrechnen und aufrunden
  Result := Format('%.2d sec', [iSeconds Mod 60]);
  iMins := iSeconds Div 60;     // Minuten ausrechnen
  If iMins = 0 Then Exit;          
  Result := Format('%.2d min, %s', [iMins Mod 60, Result]);
  iHrs := iMins Div 60;         // Stunden ausrechnen
  If iHrs = 0 Then Exit;          
  Result := Format('%.2d Std, %s', [iHrs Mod 24, Result]);
  iDays := iHrs Div 24;         // Tage ausrechnen
  Case iDays of
    0 : ;
    1 :
      Result := Format('%d Tag, %s', [aSeconds, Result]);
    Else
      Result := Format('%d Tage, %s', [aSeconds, Result]);
  End
End;

100nF 30. Dez 2005 09:03

Re: Silvester Countdown
 
Zitat:

Wenn ich im Timer-Ereignis immer die Differenz zwischen '1.1.2006 00:00:00' und Jetzt anzeige, ist es absolut egal, wie genau die Systemzeit ist,
aber mit DateTimeToStr(now) erhält man doch die systemzeit oder? wenn diese nicht stimmt, kann die differenz ja dann auch nicht stimmen.

Zitat:

[...] und wie ich das Timerinterval einstelle, solange es < 1000 ist. Es wird dann garantiert jede Sekunde mindestens einmal die Zeit abgefragt.
ja das ist mir auch klar, aber wenn der intervall z.B. 900 ist, und die zeit bei einem onTimer ereignis ist genau 10:10:10.99, dann wird ja 10:10:10 angezeigt. eine hundertstel sekunde später ist es jedoch schon 10:10:11, angezeigt wird diese zeit aber 0.8 sekunden zu spät.

faux 30. Dez 2005 10:20

Re: Silvester Countdown
 
Zitat:

Zitat von urbanbruhin
Zitat:

Wenn ich im Timer-Ereignis immer die Differenz zwischen '1.1.2006 00:00:00' und Jetzt anzeige, ist es absolut egal, wie genau die Systemzeit ist,
aber mit DateTimeToStr(now) erhält man doch die systemzeit oder? wenn diese nicht stimmt, kann die differenz ja dann auch nicht stimmen.

Das ist ja wohl klar, dass wenn die Systemzeit nicht stimmt, dass dann keine korrekte Differenz berechnet werden kann. :roll:

Zitat:

Zitat von urbanbruhin
Zitat:

[...] und wie ich das Timerinterval einstelle, solange es < 1000 ist. Es wird dann garantiert jede Sekunde mindestens einmal die Zeit abgefragt.
ja das ist mir auch klar, aber wenn der intervall z.B. 900 ist, und die zeit bei einem onTimer ereignis ist genau 10:10:10.99, dann wird ja 10:10:10 angezeigt. eine hundertstel sekunde später ist es jedoch schon 10:10:11, angezeigt wird diese zeit aber 0.8 sekunden zu spät.

Das habe ich in meinem vorherigem Post geschrieben:

Zitat:

Zitat von faux
Zitat:

Zitat von Thanatos81
Und setz den Interval vom Timer am besten auf 999, da der Timer ab und an nicht 100%ig genau geht, kann es sont in seltenen Fällen dazu kommen, dass eine Sekunde übersprungen wird.

Selbst wenn der Timer genau ginge, kann es zu diesem Vorfall kommen, da der Timer höchstwarscheinlich nicht genau zum Wechsel einer Sekunde gestartet wird.


Grüße
Faux

alzaimar 30. Dez 2005 11:28

Re: Silvester Countdown
 
[quote="urbanbruhin"]
Zitat:

... aber wenn der intervall z.B. 900 ist, und die zeit bei einem onTimer ereignis ist genau 10:10:10.99, dann wird ja 10:10:10 angezeigt. eine hundertstel sekunde später ist es jedoch schon 10:10:11, angezeigt wird diese zeit aber 0.8 sekunden zu spät.
Deshalb runden wir ja:
  • 10.99 => 11.00
    +0.9
    11.89 => 12.00
Die Genauigkeit stellt man natürlich mit dem Timerinterval ein. Wenn ich nur alle 5min. die Differenz anzeige, geht die natürlich auch entsprechend ungenau. Es ist aber nun mal so, das ich nicht alle 1ms die Zeit anzeigen muss, sondern eben nur alle paar 100 ms, z.B. 500 oder 900.

faux 30. Dez 2005 11:35

Re: Silvester Countdown
 
@urbanbruhin:
Wenn duwirklich exakt zu Mitternacht den Zeitpunkt haben willst, kannst du ja, je weniger Zeit bis Mitternacht bleibt, das Intervall verkleinern. ;)

Delphi-Quellcode:
if secsToEnd < 120 then
  Timer1.Interval := secsToEnd * 10;
Grüße
Faux

tobster 30. Dez 2005 13:09

Re: Silvester Countdown
 
Tipp: Der Typ TDateTime ist am Ende nur ein Double und kann von einem anderen subtrahiert werden:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var syl: tdatetime;
begin
 syl := StrtoDateTime('1.1.2006 00:00:00');
 label1.Caption := inttostr(trunc(syl-now))+' Tag(e) '+Timetostr(frac(syl-now));
end;

Vader 31. Dez 2005 17:44

Re: Silvester Countdown
 
hallo,

mir gefällt diese idee,
ich möchte diese procedure als "wie lange muß ich noch bis zur pension arbeiten " nutzen
bei dem code von tobster ist das datum und uhrzeit fix im programmcode,
ich würde aber ein editfeld brauchen wo man das jahr eingeben muß, weil das ist ja für jedermann
verschieden !

wie bekomme ich den edit1.text in diesen code ?

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var syl: tdatetime;
begin
syl := StrtoDateTime('1.1.2006 00:00:00');
label1.Caption := inttostr(trunc(syl-now))+' Tag(e) '+Timetostr(frac(syl-now));
end;
mfg vader

ManuMF 31. Dez 2005 18:03

Re: Silvester Countdown
 
Tipp: Nimm 2 TDateTimePicker (Tab Win32). Im OI stelle den einen Kind = dkDate, den anderen Kind = dkTime.

Dann
Delphi-Quellcode:
syl := Trunc(DateTimePicker1.Date) + Frac (DateTimePicker2.Time);
// DateTimePicker1 = dkDate, DateTimePicker2 = dkTime
Gruß,
ManuMF

Vader 31. Dez 2005 18:20

Re: Silvester Countdown
 
hallo ManuMF,

super danke !

mfg vader

Vader 31. Dez 2005 18:59

Re: Silvester Countdown
 
hallo ManuMF,

das jahr einstellen bei der komp."datetimepicker" dauert ziemlich lange wenn man zb: das jahr
2032 braucht, da muß man schon lange auf dem "weiterpfeil oben bleiben !
gibts auch eine andere möglichkeit die jahreszahl selbst einzugeben ?
mfg vader

ichbins 31. Dez 2005 20:43

Re: Silvester Countdown
 
ja. einfach das Jahr markieren und dann auf der Pfeil-nach-oben-Taste bleiben.

ManuMF 31. Dez 2005 21:00

Re: Silvester Countdown
 
Es gibt dann noch TMaskEdit. Da hat man aber keine Kalender-Auswahl.

Alternativ ein TEdit zum Eingeben:
Delphi-Quellcode:
procedure TForm.EditKeyPress(Sender: TObject; var Key: Char);
begin
  If not (key in [#48..#57,#8]) then
    key := #0;
end;

procedure TForm.ButtonClick(Sender: TObject);
begin
  DateTimePicker1.Date := StrToDate('01.01.' + Edit.Text);
end;
Gruß,
ManuMF

Vader 31. Dez 2005 21:05

Re: Silvester Countdown
 
hallo,

danke für den tipp !

Ich wünsche allen ein gutes erfolgreiches neues Jahr 2006 !!

Ich hoffe dieses Forum bleibt uns noch lange erhalten.

mfg vader

faux 31. Dez 2005 23:51

Re: Silvester Countdown
 
Und hats geklappt? ;)


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