h-elsner hat geschrieben: Fr 8. Mai 2026, 08:45
Code: Alles auswählen
function StrToFloatDefDec(const fl: string; altres: double; IgnoreLocale: boolean=true): double;
var
fs: TFormatSettings;
begin
if IgnoreLocale then begin
fs:=DefaultFormatSettings;
fs.DecimalSeparator:='.';
DefaultFormatSettings.DecimalSeparator:='.';
result:=StrToFloatDef(fl, altres, fs);
end else
result:=StrToFloatDef(fl, altres);
end;
Der Vorteil der lokalen FormatSettings ist gerade, dass DefaultFormatSettings nicht verändert werden müssen, aber du machst das, indem du in der 3.Zeile des "if" den globalen DecimalSeparator auf den Dezimalpunkt setzt. Wenn das wichtig ist, kannst du dir das mit den lokalen FormatSettings komplett sparen.
h-elsner hat geschrieben: Fr 8. Mai 2026, 08:45
Aber könnte man nicht mit den lokalen FormatSettings nicht eine globale Variable für das ganze Programm anlegen und seine Einstellungen da hart für das Programm machen?
Das geht natürlich auch, sofern du nicht globale Variablen generell reduzieren willst Du könntest dir z.B. "PointFormatSettings" definieren, die du dann in StrToFloatDef statt des lokalen fs verwendest:
Code: Alles auswählen
var
PointFormatSettings: TFormatSettings;
...
PointFormatSettings.DecimalSeparator := '.';
...
Result := StrToFloatDef(fl, altres, PointFormatSettings);
Übrigens: StrToFloatDef() halte ich für unpraktisch, weil es im Fall eines Fehlers im zu konvertierenden String klaglos den Default-Wert zurückliefert, ohne dich auf einen vielleicht trivialen Fehler hinzuweisen, und du verbringst Stunden in der Fehlersuche, warum der MapViewer immer an den Ursprung des GPS-Koordinatensystems westlich von Afrika springt. Ich bevorzuge immer TryStrToFloat, das bei einem Fehler einen False-Wert zurückgibt - den kann ich prüfen und darauf reagieren (StrToFloat selbst ginge auch, aber ich versuche Exceptions schon vor der Entstehung zu vermeiden).