![]() |
TDateTimePicker mit modus Time kennt die Zeit nicht
Diese Frage richtet sich an jene, die sich damit bereits die Haare gerauft haben.
Ich finde keinen Weg, der so funktioniert, wie die Handbücher sagen. Doch der Reihe nach: Ich verwende einen TDateTimePicker im Modus kind = dkTime, also so, dass man die Zeit einstellen / auswählen kann. Ich möchte jetzt nichts Anderes tun, als zu vergleichen, wieviele Sekunden zwischen der gewählten Uhrzeit sind und "now". Das klingt trivial, doch Delphi (XE 3) spinnt herum. Das Problem: Es wird der 1.1.1899 davor geschrieben oder eben nicht. Die Vergleiche zwischen den Zeiten werden völlig erratisch, denn ob es der 1.1.1899 um 20:31 oder nur 20:31, Es fliegt mir in allen Operationen um die Ohren! Ich probierte bis jetzt TDateTime und TTime als Typen. Ich arbeitete mit datutils und systemutils. GetTime und Time Ich probierte SecondsBetween() und griff selbst auf Frac zurück nachdem ich die double Werte versuchte, zu greifen. Die Ergebnisse sind sehr selten zufällig richtig, doch meistens sehr hohe negative Zahlen. Meiner Einschätzung nach könnte das Problem entweder liegen in der TDateTimer Komponente von Delphi XE3. Oder aber in Windows 10, das seit ca 2 Jahren in Feinheiten mit Delphi und dem Datumszugriff muckt. Das äußert sich so, dass das Datum zuweilen als "Null" an Delphi durchgereicht wird. (Als Workaround gab es nur eine Änderung in der Formatanzeige von Win 10.) Weiß jemand einen Workaround für mich? Wie gesagt, geht es nur datum, die ausgewählte Zahl des TDateTimePickers mit der Jetzt-Zeit zu vergleichen, und die Sekunden dazwischen zu berechnen, - das leider aber ziemlich oft. D.h. je einfacher der Workaround wäre, desto besser. Wenn es an Win 10 (21H2) liegen sollte, dann wäre guter Rat teuer. und PS: Es wird nicht einmal der TDateTimePicker unbedingt benötigt. Es soll nur eine Zeit-Eigabe sein, wo der Nutzer keinen Blödsinn eingeben kann. |
AW: TDateTimePicker mit modus Time kennt die Zeit nicht
Die Vergleichszeit müsste sich doch aus Trunc(date) + DateTimePicker.Time ergeben, oder täusche ich mich? Evtl. kann man das Trunc() auch weglassen, schaden kann es jedenfalls nicht.
|
AW: TDateTimePicker mit modus Time kennt die Zeit nicht
In Delphi mit Zeit-Werten umzugehen, ich gebe zu das es mich davor auch schon desöfteren gegrault habe.
Ich gehe da meist sehr pragmatisch vor indem ich alles atomatisiere um dann auf dem Rückweg mir das abzuholen was ich brauche. Also trenne ich immer schön brav alles in Tag Monat Jahr Stunden Minuten Sekunden Tausendstel auf. Dann erstelle ich mir ein neue Variable per Encode (Date/Time). (in deinem Fall würde ich dann SecondsBetween oder ähnliches nutzen) Okay, in einer Schleife ist das der Overkill, ich meine es ist sehr unperformant, aber es stellt einen immer glücklich da man die volle Kontrolle hat. |
AW: TDateTimePicker mit modus Time kennt die Zeit nicht
Ich habe das gerade unter Delphi 11 probiert und das passt eigentlich ganz gut. Welche Delphi-Version verwendest du?
Delphi-Quellcode:
var
secs: Int64; T1: TDateTime; T2: TDateTime; begin T1 := DateTimePicker1.Time; T2 := TimeOf(Now); secs := SecondsBetween(T1, T2); case CompareTime(T1, T2) of LessThanValue: ; EqualsValue: ; GreaterThanValue: secs := -secs; end; Memo1.Lines.Add(secs.ToString); end; |
AW: TDateTimePicker mit modus Time kennt die Zeit nicht
Was ist denn nun so schwer?
Du willst nur die Zeiten vergleichen .... also vergleiche doch auch nur die Zeiten und entferne das Datum. Trunc und Frac würde ich aber hier nicht verwenden, auch wenn es mathematisch das Gleiche macht, wie ![]() ![]() "Logisch" macht es was Anderes und so ist der Code auch selbstdokumentierend. [edit] CompareTime verwendet intern natürlich auch TimeOf [/edit] Bzw., wenn du nur die Zeit haben willst, warum liest du dann nicht nur die Zeit aus? ![]() ![]() ![]() Alternativ kann man auch zu Beginn (OnCreate) ![]() ![]() So lange dann niemand zu lange zum Auswählen braucht und Mitternacht verschläft, dann passt es ja noch zusammen. |
AW: TDateTimePicker mit modus Time kennt die Zeit nicht
Lieben Dank an Kodezwerg.
Damit werde ich es wohl probieren. Mein Problem ist ja genau, dass alle jene Dinge, die ein Programmierer sinnvollerweise tun würde und die daher auch von vielen hier vorgeschlagen wurden, - nicht funktionieren. Mir bleibt da leider nur, eines von den Videos anzusehen, wo Leute ihren PC-Hardware in Einzelteile zertreten, weil mir die Eigen-Ausführung davon zu kostspielig ist ;-) |
AW: TDateTimePicker mit modus Time kennt die Zeit nicht
Kleines Testprogramm?
|
AW: TDateTimePicker mit modus Time kennt die Zeit nicht
Hier mal eine einfache Funktion, die nur den Zeitanteil zum Errechnen den Sekunden verwendet.
Delphi-Quellcode:
Das ganze ist aus der System.DateUtils abgekupfert.
function DateTimeToMilliseconds(const ADateTime: TDateTime): Int64;
begin Result := DateTimeToTimeStamp(ADateTime).Time div MSecsPerSec; end; Hier ein Beispiel für den Vergleich:
Delphi-Quellcode:
...
Seconds := DateTimeToMilliseconds(Now) - DateTimeToMilliseconds(DateTimePicker1.Time); ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 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 by Thomas Breitkreuz