Werden Gleitkommawerte in WindowsXP und Windows7 in Delphi Programmen unterschiedlich interpretiert?
Auch wenn es hier schon ähnliche Threads gibt, möchte ich ein Problem schildern, das mir gerade auf die Füße gefallen ist.
Ich verwende bisher für die Aus- und Eingabe von Gleitkommadaten die einfachen Formatierungsfunktionen z.B. Format('%8.2f',[gkzahl]) oder FloatToStr(gkzahl) bzw. StrToFloat('0,75'). Da die Ländereinstellungen alle auf "Deutsch" stehen und dort das Komma als Decimalseparator eingetragen ist, funktionierte das bisher (alle PC's in unserer Firma hatten WinXP) ohne Probleme.
Seit Win7 kommt die Software nicht mehr mit dem "Komma" als Decimalseparator klar.
Kleines Beispiel:
Delphi-Quellcode:
GetLocaleFormatSettings(GetSystemDefaultLCID, FSettings);
Edit1.Text:=FSettings.DecimalSeparator;
Edit2.Text:=FSettings.ThousandSeparator;
liefert sowohl unter WinXP als auch unter Win7 erwartungsgemäß in den Edit-Feldern für Decimalseparator das Komma und für ThousandSeparator den Punkt.
Delphi-Quellcode:
x:=3;
y:=4;
z:=x/y;
Edit3.Text:=Format('%8.2f',[z]);
zeigt mir unter WinXP als Ergebnis 0,75 (Null Komma 75) an.
Unter Win7 steht in dem Editfeld 0.75 (Null Punkt 75).
Die offensichtliche Lösung in diesem Fall ist, überall Ausgaben der Form
Edit3.Text:=Format('%8.2f',[z],fsettings);
zu verwenden. (Das würde bei der von mir in den letzten ca. 20 Jahren geschriebenen Software höchstens 10000 Zeilen verteilt auf vielleicht 1000 Quelltextfiles betreffen, wäre also prinzipell machbar.
)
Nun meine Frage: Ein ähnliches Problem habe ich mit der Abfrage von Datenbankfeldern.
Unter WinXP haben Abfragen der Art:
gkwert:=Tabelle.FieldByName('Feldname').AsFloat;
immer funktioniert, auch wenn implizit Typumwandlungen notwendig waren (wenn z.B. das Tabellenfeld als Text vereinbart war).
Unter Win7 kommt es an dieser Stelle zum Konvertierungsfehler (0,75 ist kein Gleitkommawert)
Gibt es eine Lösung, dieser "AsFloat"-Funktion auch die FormatSettings mitzuteilen oder muss ich mir mit einem Konstrukt wie:
Delphi-Quellcode:
zkwert:=Tabelle.FieldByName('Feldname').AsString;
gkwert:=StrToFloat(zkwert, fsettings);
helfen???
Generell würde mich interessieren, woher meine Anwendung im Falle, dass ich nicht die "threadsicheren" Funktionsaufrufe mit expliziter FormatSettings-Übergabe verwende, diese Informationen hernimmt.
Herzliche Grüße
Harald