Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Anderes Verhalten in 12.3 (https://www.delphipraxis.net/217060-anderes-verhalten-12-3-a.html)

Edelfix 17. Apr 2025 11:55

Anderes Verhalten in 12.3
 
Hallo,

diese Woche von Delphi 10.4 auf 12.3 umgestiegen.

Folgender Quellcode verhält sich unterschiedlich:

Delphi-Quellcode:
var
  StrWert: String;
  fWert: Single;
begin
  StrWert := '71.4';
  fWert := StrToFloatDef(StrWert, 0); //in 10.4 ist fWert 71,4 und in 12.3 ist es 0
end;
FormatSettings wird nicht gesetzt.

Olli73 17. Apr 2025 12:33

AW: Anderes Verhalten in 12.3
 
Wie ist denn der Decimalseparator bei dir in Windows eingestellt?

Edelfix 17. Apr 2025 13:34

AW: Anderes Verhalten in 12.3
 
Der Decimalseparator ist wie bei Standard Windows eingestellt. Also ",".

Damit macht die Version 12.3 es korrekt.

Das Problem ist nur das geänderte Verhalten.

Es rächt sich wenn man mit dem Update zu lange wartet. Jetzt die ganzen Versions Änderungen seit 10.4 durch zu gehen währe mühsam.

himitsu 17. Apr 2025 13:36

AW: Anderes Verhalten in 12.3
 
PS: Genau für sowas gibt es natürlich eine Überladung dieser Funktion, wo du ein passendes FormatSetting übergeben kannst. (für "english" gibt es ein Vordefiniertes)

Alternativ den String zu Laufzeit mit dem aktuellen DecimalSeparator zusammenbauen.

Andreas13 18. Apr 2025 10:51

AW: Anderes Verhalten in 12.3
 
Hallo Edelfix,
damit beim Umsteigen von einer auf eine andere Delphi-Versionen sich soche Überraschungen in Grenzen halten, verwende ich zum eindeutigen Setzen meiner Format-Settings folgende Routine:
Delphi-Quellcode:
Procedure MyFormatSettings;
// Setzt DecimalSeparator etc. per Initialization
// Quelle:
// DecimalSeparator in SysUtils and System.SysUtils - Stack Overflow.pdf
// http://stackoverflow.com/questions/25109497/decimalseparator-in-sysutils-and-system-sysutils
// von Rodrigo Garcia

Var
  MyFormat: TFormatSettings;  // --> TFormatSettings = record, daher KEIN MyFormat.Free!

Begin
  MyFormat:= TFormatSettings.Create;
   
  MyFormat.DecimalSeparator := '.'; // ',';
  MyFormat.ThousandSeparator:= ','; // '.';
  MyFormat.CurrencyDecimals := 2;
  MyFormat.DateSeparator   := '/';
  MyFormat.ShortDateFormat := 'dd/mm/yyyy';
  MyFormat.LongDateFormat  := 'dd/mm/yyyy';
  MyFormat.TimeSeparator   := ':';
  MyFormat.TimeAMString    := 'AM';
  MyFormat.TimePMString    := 'PM';
  MyFormat.ShortTimeFormat := 'hh:nn';
  MyFormat.LongTimeFormat  := 'hh:nn:ss';
  MyFormat.CurrencyString  := 'R€'; // 'R$';

  System.SysUtils.FormatSettings:= MyFormat;
// 
// TFormatSettings = record, daher KEIN MyFormat.Free! 
End;{Procedure MyFormatSettings}
{------------------------------}
MyFormatSettings wird per Initialisierung in allen betroffenen eigenen Units eingebunden:
Delphi-Quellcode:
Unit Meine_Mathematische_Bibliothek; // etc.

Interface
...

Implementation

Uses
  System.SysUtils;
...

Initialization
  MyFormatSettings;
...
Finalization // ExitProcedures
...
End.
Vielleicht hilft es Dir.
Viel Erfolg!

Uwe Raabe 18. Apr 2025 11:51

AW: Anderes Verhalten in 12.3
 
Das Setzen von System.SysUtils.FormatSettings würde ich als höchst fragwürdig einstufen.
Nicht ohne Grund gibt es die Überladungen mit einem TFormatSettings Parameter. Damit kann man dann ja einen speziellen Record übergeben.
Der globale Parameter wird ja immer anhand der Windows-Einstellungen initialisiert. Diese sollte man für die Darstellung eigentlich respektieren.
Lediglich beim Speichern und Lesen ist es gegebenenfalls sinnvoll ein invariantes Format zu verwenden.

himitsu 18. Apr 2025 14:29

AW: Anderes Verhalten in 12.3
 
Jo, vor allem da die VCL standardmäßig gern dieses globale Setting überschreibt / neu lädt,
z.B. wenn sich an den SystemSettings etwas ändert und bei anderen Gelegenheiten.

Delphi-Quellcode:
MySettings := TFormatSettings.Invariant;
MySettings := TFormatSettings.Create($0409);
MySettings := TFormatSettings.Create('en-US');
...
anschließend vielleicht noch ein zwei Dinge anpassen, wenn abweichend, wie z.B. MySettings.CurrencyString.

Mantrid 18. Apr 2025 14:41

AW: Anderes Verhalten in 12.3
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1548113)
Das Setzen von System.SysUtils.FormatSettings würde ich als höchst fragwürdig einstufen.
Nicht ohne Grund gibt es die Überladungen mit einem TFormatSettings Parameter. Damit kann man dann ja einen speziellen Record übergeben.
Der globale Parameter wird ja immer anhand der Windows-Einstellungen initialisiert. Diese sollte man für die Darstellung eigentlich respektieren.
Lediglich beim Speichern und Lesen ist es gegebenenfalls sinnvoll ein invariantes Format zu verwenden.

Dazu eine Frage, weil ich auch damit ein Problem habe.

Mein alter Arbeitgeber hat auch die Settings, wie von Andreas13, überschrieben.

Ich suche jetzt nach einer Lösung, wo ich Benutzerabhängig Dezimalzeichen und Tausender Zeichen unabhängig von den Regioneinstellungen ändern kann. D.h. je nach angemeldetem Benutzer soll sich das ändern. Gibt es da eine bessere Möglichkeit als die von Andreas13?

Uwe Raabe 18. Apr 2025 14:51

AW: Anderes Verhalten in 12.3
 
Zitat:

Zitat von Mantrid (Beitrag 1548115)
D.h. je nach angemeldetem Benutzer soll sich das ändern.

Angemeldet bei Windows oder bei eurer Anwendung?

Mantrid 18. Apr 2025 16:00

AW: Anderes Verhalten in 12.3
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1548116)
Zitat:

Zitat von Mantrid (Beitrag 1548115)
D.h. je nach angemeldetem Benutzer soll sich das ändern.

Angemeldet bei Windows oder bei eurer Anwendung?

An unserer Anwendung.

Windos Benutzer ist immer der gleiche.

Uwe Raabe 18. Apr 2025 16:31

AW: Anderes Verhalten in 12.3
 
In dem Fall kannst du die FormatSettings nach jeder Anmeldung entsprechend setzen. Die automatische Anpassung bei Änderungen in Windows kannst du mit
Delphi-Quellcode:
 Application.UpdateFormatSettings := False
unterbinden.

Sinspin 18. Apr 2025 17:50

AW: Anderes Verhalten in 12.3
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1548113)
Das Setzen von System.SysUtils.FormatSettings würde ich als höchst fragwürdig einstufen.
Nicht ohne Grund gibt es die Überladungen mit einem TFormatSettings Parameter. Damit kann man dann ja einen speziellen Record übergeben.

Nun, wenn sich alle Komponenten, auch die Delphi eigenen, sich daran halten würden und ihre eigenen FormatSettings bereistellen würden (und diese auch verwenden!).
Leider zeigt uns FireDac (D11.1) ganz fröhlich den dritten Finger von rechts wenn es ums Auswerten von Filtern geht.
Sind die globalen Settings nicht überschrieben, müsste ich auf jedem System die Filter anders erstellen, was absolut Banane ist.

Uwe Raabe 18. Apr 2025 17:58

AW: Anderes Verhalten in 12.3
 
Und der zugehörige Bugreport hat welche Nummer?


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