Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TDate: Vergleich = 0 funktioniert nicht immer - warum? (https://www.delphipraxis.net/215146-tdate-vergleich-%3D-0-funktioniert-nicht-immer-warum.html)

Hobbycoder 17. Mai 2024 09:03

AW: TDate: Vergleich = 0 funktioniert nicht immer - warum?
 
Man könnte auch einfach in
Delphi-Quellcode:
if Trunc(aDate) > 0 then
ändern. Damit wäre der Stunden-, Minuten-, Sekunden- und Millisekundenanteil egal.

rdeutsch 17. Mai 2024 09:12

AW: TDate: Vergleich = 0 funktioniert nicht immer - warum?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1536786)
Zitat:

Zitat von himitsu (Beitrag 1536777)
Deine "0" könnte halt eigentlich ein 0.00000000000000000000001 sein, oder so.

.. Mit einer Anpassung der Vergleiche (auf > 0) wird die eigentliche Ursache für das unterschiedliche Verhalten nur verdeckt.

Da stimme ich dir zu, aber das Problem ist, dass sich an der Basis für die Zuweisung des Datumfeldes nichts geändert hat.
In meinem konkreten Programmcodeabschnitt erhält die Datumsvariable ihren Wert über einen Soap-Request. Weder am Service, der WSDL-Importunit noch im verarbeiteten Codeteil hat es Änderungen gegeben.

Die "einzige" Änderung der bisherigen Applikation zur aktuellen Version ist, dass auf UTF8 umgestellt wurde. D.h. z.B. persistente Felder wurden von TStringField auf TWideStringField geändert. Ansonsten wurde nichts verändert.

Uwe Raabe 17. Mai 2024 09:31

AW: TDate: Vergleich = 0 funktioniert nicht immer - warum?
 
Zitat:

Zitat von rdeutsch (Beitrag 1536788)
Da stimme ich dir zu, aber das Problem ist, dass sich an der Basis für die Zuweisung des Datumfeldes nichts geändert hat.
In meinem konkreten Programmcodeabschnitt erhält die Datumsvariable ihren Wert über einen Soap-Request.

Dann würde ich zunächst an genau der Stelle (wie auch beim Vergleich) schauen, ob im Datumswert tatsächlich alle Bytes auf 0 stehen (z.B. eine Watch-Variable als Hex darstellen). Dem Debugger-Visualizer für TDate würde ich da nur begrenzt trauen.

Natürlich ist ein toleranterer Vergleich schnell und einfach umzusetzen. Trotzdem bleibt die eigentliche Ursache weiterhin verborgen. Das kann ja auch noch ganz andere Probleme verursachen, die ihr bloß noch nicht bemerkt habt. Wenn nicht, umso besser. Ich persönlich hätte dabei aber ein schlechtes Gefühl.

Zitat:

Zitat von Hobbycoder (Beitrag 1536787)
Man könnte auch einfach in
Delphi-Quellcode:
if Trunc(aDate) > 0 then
ändern. Damit wäre der Stunden-, Minuten-, Sekunden- und Millisekundenanteil egal.

Guter Hinweis! Ich würde in dem Fall dann sogar für DateOf aus System.DateUtils plädieren, das intern zwar dasselbe tut, aber die Intention besser darstellt.

Insbesondere würde ich das schon bei der Zuweisung machen. Dann kann man sich die Anpassung der Vergleiche nämlich sparen.

Hobbycoder 17. Mai 2024 09:41

AW: TDate: Vergleich = 0 funktioniert nicht immer - warum?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1536790)
Zitat:

Zitat von Hobbycoder (Beitrag 1536787)
Man könnte auch einfach in
Delphi-Quellcode:
if Trunc(aDate) > 0 then
ändern. Damit wäre der Stunden-, Minuten-, Sekunden- und Millisekundenanteil egal.

Guter Hinweis! Ich würde in dem Fall dann sogar für DateOf aus System.DateUtils plädieren, das intern zwar dasselbe tut, aber die Intention besser darstellt.

Insbesondere würde ich das schon bei der Zuweisung machen. Dann kann man sich die Anpassung der Vergleiche nämlich sparen.

Wenn ich mit reinen Datumswerten arbeite, mache ich das immer (mit Trunc). TDate ist eigentlich ein TDateTime und das ist eigentlich Double. Und einen Integer gegen eine Double zu testen ist, sofern die Zuweisung nicht unmittelbar davor passiert, eigentlich nie eine gute Idee.

Uwe Raabe 17. Mai 2024 10:09

AW: TDate: Vergleich = 0 funktioniert nicht immer - warum?
 
Zitat:

Zitat von Hobbycoder (Beitrag 1536791)
TDate ist eigentlich ein TDateTime und das ist eigentlich Double. Und einen Integer gegen eine Double zu testen ist, sofern die Zuweisung nicht unmittelbar davor passiert, eigentlich nie eine gute Idee.

In einem 64-Bit Double lassen sich Ganzzahlwerte bis 2^53 exakt und ohne Verlust speichern. Das ist wesentlich mehr als ein 32-Bit-Integer haben kann. Warum sollte das dann keine gute Idee sein?

Wenn in einem TDate kein Wert drin steht, der sich exakt in einen Integer umwandeln lässt, dann liegt meiner Meinung nach irgendwo ein Fehler vor. Das kann bei der Zuweisung sein oder einer anderen Manipulation (z.B. als var-Parameter einer Methode).


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:33 Uhr.
Seite 2 von 2     12   

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