Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi TDateTimePicker mit modus Time kennt die Zeit nicht (https://www.delphipraxis.net/210806-tdatetimepicker-mit-modus-time-kennt-die-zeit-nicht.html)

NicoleWagner 13. Jun 2022 19:44

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.

DeddyH 13. Jun 2022 20:15

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.

KodeZwerg 13. Jun 2022 20:56

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.

Uwe Raabe 13. Jun 2022 21:14

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;

himitsu 13. Jun 2022 21:19

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 Delphi-Referenz durchsuchenDataOf und Delphi-Referenz durchsuchenTimeOf.
"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?
Delphi-Referenz durchsuchenTDateTimePicker.DateTime
Delphi-Referenz durchsuchenTDateTimePicker.Date
Delphi-Referenz durchsuchenTDateTimePicker.Time



Alternativ kann man auch zu Beginn (OnCreate) Delphi-Referenz durchsuchenNow bzw. Delphi-Referenz durchsuchenDate in den TDateTimePicker eintragen.
So lange dann niemand zu lange zum Auswählen braucht und Mitternacht verschläft, dann passt es ja noch zusammen.

NicoleWagner 15. Jun 2022 14:12

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 ;-)

freimatz 15. Jun 2022 15:11

AW: TDateTimePicker mit modus Time kennt die Zeit nicht
 
Kleines Testprogramm?

BerndS 15. Jun 2022 15:53

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:
  function DateTimeToMilliseconds(const ADateTime: TDateTime): Int64;
  begin
    Result := DateTimeToTimeStamp(ADateTime).Time div MSecsPerSec;
  end;
Das ganze ist aus der System.DateUtils abgekupfert.

Hier ein Beispiel für den Vergleich:

Delphi-Quellcode:
 ...
 Seconds := DateTimeToMilliseconds(Now) - DateTimeToMilliseconds(DateTimePicker1.Time);
 ...


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