Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi StrToTime löst unerklärbare Exception aus (https://www.delphipraxis.net/87931-strtotime-loest-unerklaerbare-exception-aus.html)

easywk 7. Mär 2007 15:06


StrToTime löst unerklärbare Exception aus
 
Hallo zusammen,

ich benutze in meiner Software eine grundlegende Routine, die aus einem String im Format HH:MM:SS,zzz (Beispiel: 00:00:25,570) mittels StrToTime einen TDateTime-Wert machen soll:
Delphi-Quellcode:
try
  Result:=StrToTime(s);
except
  Result:=-1;
end;
Das funktioniert bei meinen Kunden auf den unterschiedlichsten Windows-Systemen auch wunderbar. Nur bei einem Kunden (WindowsXP Home, Service Pack 2) nicht - der bekommt immer -1 also die Exception. Die eingelesenen Daten aus einer Textdatei sind bei mir die gleichen wie bei ihm - bei mir geht es problemlos, bei ihm nicht. Jetzt habe ich mittels Logfiles und Ferndiagnose schon folgendes rausgefunden:

(a) Die Systemeinstellungen wie TimeSpearator, Timeformat usw. sind exakt die gleichen wie bei mir
(b) als Exception kommt "'00:00:25,570' ist keine gültige Uhrzeit"

Ich bin mit meinem Latein am Ende. Hat jemand eine Idee woran es noch liegen kann?

cu
easy

sakura 7. Mär 2007 15:26

Re: StrToTime löst unerklärbare Exception aus
 
Hat er zufällig ein nicht-deutsches Windows, oder sind seine Regional-Settings anders? Typisches Problem, StrToTime & Co. sind sprachabhängig.

...:cat:...

Der_Unwissende 7. Mär 2007 15:29

Re: StrToTime löst unerklärbare Exception aus
 
Zitat:

Zitat von easywk
(a) Die Systemeinstellungen wie TimeSpearator, Timeformat usw. sind exakt die gleichen wie bei mir
(b) als Exception kommt "'00:00:25,570' ist keine gültige Uhrzeit"

Hi, ich würde sagen, dass Du schon auf dem richtigen Weg bist, an einer anderen Stelle sollte es gar nicht scheitern. Hast Du denn alle Lokale-Einstellungen ausgelesen? Insbesonder auch ShortTimeFormat? Ich glaube das war das Format (steht in der OH), dass zur Umwandlung tatsächlich verwendet wird (ok, gerade nachgeschaut, ist wohl doch der TimeSeperator, sorry).
Noch besser ist es aber, wenn Du Dich nie darauf verlässt, dass Du hier den richtigen Wert auf dem Rechner des Kunden vorfindest und diese Einstellungen immer setzt. Was natürlich noch bleibt ist der Dezimale-Seperator, der ist nicht überall ein Komma!

Der beste Weg ist (wie gesagt), dass Du Dich nie darauf verlässt, dass das System des Kunden eine bestimmte Einstellung besitzt. Hol Dir einfach mit GetLocaleFormatSettings die aktuellen Einstellungen und setze alle diese Einstellungen (die Du verwendest) explizit auf den richtigen Wert. Dieses veränderte Record übergibst Du dann mit an die Funktion StrToTime und dann sollte es immer ohne Probleme laufen. Teste es einfach mal, indem Du den Dezimal-Seperator und den TimeSeperator setzt.

Welche dieser Werte wirklich verwendet werden kannst Du natürlich lokal bei Dir prüfen, setze einfach mal alle Felder des Records auf einen völlig dummen Wert (z.B. '#') und änder nur die, von denen Du ausgehst, dass sie benötigt werden (also erstmal nur TimeSeperator). Klappt dann die Umwandlung, dann liegt das Problem wirklich woanders, scheiterst Du aber auch, dann wird eine der anderen Einstellungen ebenfalls nötig sein (z.B. der schon sooft erwähnte Dezimal-Seperator).

Gruß Der Unwissende

easywk 7. Mär 2007 15:33

Re: StrToTime löst unerklärbare Exception aus
 
Ob es ein nicht-deutsches Windows ist kann ich nicht sagen. Aber ich habe auch schon folgendes probiert:
Delphi-Quellcode:
GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT,StartFormatSettings);
try
  Result:=StrToTime(s,StartFormatSettings);
except
  Result:=-1;
end;
Und die StartFormatSettings habe ich in einer Logdatei ausgegeben. Sind die gleichen Werte wie bei mir.

Selbst
Delphi-Quellcode:
GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT,StartFormatSettings);
StartFormatSettings.ThousandSeparator:='.';
StartFormatSettings.DateSeparator:='.';
StartFormatSettings.TimeSeparator:=':';
StartFormatSettings.DecimalSeparator:=',';
try
  Result:=StrToTime(s,StartFormatSettings);
except
  Result:=-1;
end;
hat nichts gebracht - und spätestens dann müssen es ja die korrekten Settings sein, oder?

easywk 7. Mär 2007 15:36

Re: StrToTime löst unerklärbare Exception aus
 
Das setzen der Werte, also
Delphi-Quellcode:
GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT,StartFormatSettings);
StartFormatSettings.ThousandSeparator:='.';
StartFormatSettings.DateSeparator:='.';
StartFormatSettings.TimeSeparator:=':';
StartFormatSettings.DecimalSeparator:=',';
habe ich allerdings nicht in der Routine selber gemacht sondern in einem begin ... end-Teil einer globalen Unit. Müsste doch aber reichen, oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:35 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-2025 by Thomas Breitkreuz