Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TDateTime bei über 24h abbruch (https://www.delphipraxis.net/4254-tdatetime-bei-ueber-24h-abbruch.html)

Haegar 21. Apr 2003 12:27


TDateTime bei über 24h abbruch
 
hi,
ich hab ne stoppuhr programmiert, als wert der hochgezählt wird hab ich dafür ne variable vom typ TDateTime verwendet, nun muss ich aber feststellen, das die zum beispiel bei über 24h ne fehlermeldung bringt.
also zumindest wenn ich den wert dann lade!
wenn er läuft, und erreicht die 24h marke, geht er ja auf 0 zurück!
nun die frage, kann ich es trotzdem mit diesem datentypen regeln, das er z.B. bis 99h läuft, man diesen wert speichert, und immer wieder laden kann ohne den abbruch? oder muss ich dafür nen andern datentypen nehmen?

gruss haegar

MrSpock 21. Apr 2003 14:39

Hallo Haegar,
der Abbruch liegt sicher nicht an dem TDateTime Typ, der eine Reele Zahl ist. Der Abbruch muss woanders herkommen. Poste doch mal die Stelle rund um die "Fehlerzeile".

Haegar 21. Apr 2003 15:01

das problem is ja erst zur laufzeit, un da kommt dann die fehlermeldung 25:04:00 is not a valid Time
jetzt als beispiel, ich denke er gibt die fehlermeldung bei 24:00:00 oder spätestens bei 24:00:01 aus!
ich glaube kaum das es an was anderem liegt, denn es klappt mimt allen angaben, nu nicht mit werten über die über 24h hinaus gehen

gruss haegar

MrSpock 21. Apr 2003 15:22

Hallo Haegar,

ich denke da hat Delphi ja nicht ganz unrecht :mrgreen: : so 25:08 ist ja ein wenig komisch. Die Frage ist aber wie erzeugst du aus deinem TDateTime Wert diese Anzeige?
Der Wert selbst ist ja wie gesagt einfach eine Realzahl.

Haegar 21. Apr 2003 15:26

hab das bisher so gemacht!
Delphi-Quellcode:
procedure TForm1.timerTimer(Sender: TObject);
begin
 dauer:=Now-start+bisher;
 lbl_zeit.Caption:=FormatDateTime('t',dauer);
end;

//im FormCreate
ShortTimeFormat:='hh "h" nn "min" ss "s"';
gruss haegar

MrSpock 21. Apr 2003 15:34

Hallo Haegar,

du ikannst entweder TimeToStr benutzen, eine Funktion, die immer nur Werte bis 24:00:00 ausgibt, oder um bei deinem Code zu bleiben. Wenn du nur den Teil nach dem Komma nutzt, erhälst du die Uhrzeit:

Delphi-Quellcode:
dauer:=Frac(Now-start+bisher);
Der Anteil vor dem Komma sind die ganten Tage, die du mit Frac einfach abschneidest.

Haegar 21. Apr 2003 15:43

naja mit der funktion TimeToStr und StrToTime hab ich sie gespeichert, bzw. lade sie damit....das problem is ja das ich nicht werte laden kann, die jenseits der 24h liegen, soll ich da nen anderen datentypen wählen?? oder geht das irgendwie mit dem TDateTime??
ich denke mal da liegt das problem :nerd:

gruss haegar

MrSpock 21. Apr 2003 15:47

Hallo Haegar,

du kannst es weiter wie bisher machen, wenn du wie oben gezeigt die Funktion Frac verwendest.

Haegar 21. Apr 2003 15:56

Liste der Anhänge anzeigen (Anzahl: 1)
und wenn ich dir sage das er trotzdem meckert? :nerd:
selbe fehlermeldung

gruss haegar
edit: so mal die fehlermeldung in anhang gemacht, war nur ein test mit der zeit, aber die erscheint nach wie vor immer noch

Wolff68 21. Apr 2003 18:02

Wie wärs denn mit dem hier als Anzeige:
Code:
dauer := IntToStr(MyHoursBetween(ANow, AThen))
        +FormatDateTime(':nn:ss:zzz', Abs(AThen-ANow));
Damit kannst die Stoppuhr laufen lassen, bis der Int64 überläuft (bis dahin sind wir nichtmal mehr Staub!) :wink:

Statt MyHoursBetween kannst auch HoursBetween aus der Unit DateUtils nehmen. Aber ich binde dieses Monster ungern wegen einer Zeile Code ein.
Hier der Code:
Code:
function MyHoursBetween(ANow, AThen: TDateTime): INT64;
begin
  Result := Trunc(24*Abs(AThen-ANow));
end;
Ähmm. ANow steht hierbei für die StartZeit, und AThen für die Stop-Zeit.
(Wobei es hier ohnehin egal ist, wenn Du das vertauschst)

MrSpock 21. Apr 2003 20:21

Hallo Haegar,

das kann nicht sein, Frac liefert immer eine Real Zahl unter 1.00 zurück, damit liefert FormatDateTime nie einen Wert über 24:00! Poste bitte mal den Code mit dem Aufruf von Frac.

Haegar 21. Apr 2003 20:52

@spock: na es ist aber so das ich anfangen lasse mit laufen, irgendwann is stopp, und der wert wird in datei gespeichert.....wenn ich nun neu stoppe, lade ich den alten wert, und die zeit zählt weiter!!
so kommt man doch locker über 24h.

das is ja das problem!
gruss haegar

MrSpock 21. Apr 2003 21:16

Hallo Haegar,

das ist ja nicht der Punkt. Die Differenz, die du in der Variablen dauer speicherst, kann irgendeine Real Zahl sein, als Beispiel: 2.5 (das wären 2 Tage und 12 Stunden) wenn du aber Frac davor schreibst, kommt 0.5 raus. Frac liefert immer Ergebnisse, die kleiner als 1 sind, darum kann bei Anzeige von dauer, wenn du sie so berechnest wie ich beschrieben habe, nie mehr als 24:00 rauskommen. Poste doch bitte noch einmal deine Methode procedure TForm1.timerTimer(Sender: TObject), wie sie jetzt aussieht.

Haegar 21. Apr 2003 21:23

Zitat:

Zitat von Haegar
hab das bisher so gemacht!
Delphi-Quellcode:
procedure TForm1.timerTimer(Sender: TObject);
begin
 dauer:=Now-start+bisher;
 lbl_zeit.Caption:=FormatDateTime('t',dauer);
end;

//im FormCreate
ShortTimeFormat:='hh "h" nn "min" ss "s"';
gruss haegar

so sieht sie aus! :mrgreen:

gruss haegar

MrSpock 21. Apr 2003 21:27

Hallo Haegar,

damit es funktioniert, muss du es aber so machen:

Delphi-Quellcode:
procedure TForm1.timerTimer(Sender: TObject);
begin
  { Hier Frac einfügen }
  dauer := Frac(Now-start+bisher);
  lbl_zeit.Caption := FormatDateTime('t',dauer);
end;

Haegar 21. Apr 2003 21:37

ja hab ich ja, aber das problem ist, das er über 24h laufen muss. bis 99 oder so!!

gruss haegar

MrSpock 21. Apr 2003 21:41

Hallo Haegar,

ohhh sorry, da habe ich dich falsch verstanden, dann schau dir doch noch einmal die Lösung von Wolff68 an.

Haegar 21. Apr 2003 22:01

MyHoursBetween-funktion ist ihm nicht bekannt. aus welcher unit ist die??

gruss haegar

Daniel B 21. Apr 2003 22:07

Zitat:

Zitat von Haegar
MyHoursBetween-funktion ist ihm nicht bekannt. aus welcher unit ist die??

DateUtils, heisst aber nur HoursBetween.

Grüsse, Daniel :hi:

Haegar 21. Apr 2003 22:14

jetzt zählt er gar net mehr hoch (bleibt immer bei 0).
Delphi-Quellcode:
procedure TForm1.timerTimer(Sender: TObject);
begin
 dauer:=HoursBetween(Now,start);
 lbl_zeit.Caption:=FormatDateTime('t',dauer);
end;
gruss haegar

MrSpock 22. Apr 2003 06:37

Hallo Haegar,

Wolff68 hat in seinem Posting oben die Funktion MyHoursBetween selbst geschrieben. Außerdem muss du dann auch wie Wolff68 gezeigt hat die Ausgabe erzeugen. Er setzt die Ausgabe aus den Stunden, die er mit MyHoursBetween berechnet und den Minuten und Sekunden zusammen.

Haegar 22. Apr 2003 17:42

do, jetzt hab ich aber das problem, das ich beim stoppen der variablen bisher den wert von dauer zuweise, und da kommt dann immer z.B. 00h 01min 03s is not a valid time !? wie muss ich das nu wieder lösen?
bisher=TDateTime :mrgreen:

gruss haegar
gut hat sich erledigt, hab zwar noch kleines problem, aber ich denke das krieg ich auch so hin :mrgreen:.......danke für die hilfe


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