![]() |
SetLocaleInfo
Ich muss in einem Programm in dem mehrere Gleitkommawerte bearbeitet werden für zum Beispiel die Region Schweiz den Dezimalseparator von Punkt auf Komma stellen und am Programmende natürlich wieder zurück.
Ich habe das mal so gemacht, hier noch mit der entsprechenden Anzeige was eingestellt ist und was dann eingestellt wurde, steht in der FormCreate:
Delphi-Quellcode:
Funktioniert also. Auch die händische Prüfung in den Regionseinstellungen zeigt das korrekt an. Aber das Programm nörgelt im weiteren Verlauf dann rum von wegen kein gültiger Gleitkommawert wegen dem Punkt. MyDecimal:=StrAlloc(10); GetLocaleInfo(LOCALE_SYSTEM_DEFAULT,LOCALE_SDECIMAL,MyDecimal,10); Showmessage('System decimal is: '+ MyDecimal); // aktuell ist hier ist jetzt der Punkt gesetzt Application.UpdateFormatSettings := True; SetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, ','); Application.UpdateFormatSettings := False; MyDecimal:=StrAlloc(10); GetLocaleInfo(LOCALE_SYSTEM_DEFAULT,LOCALE_SDECIMAL,MyDecimal,10); Showmessage('System decimal is: '+ MyDecimal); // aktuell ist hier ist jetzt das Komma gesetzt Bis ich das Programm nochmal starte. Dann geht es. Also nehme ich mal an ich muss dem Programm noch explizit Bescheid sagen. Aber wie? Oder ist was anderes falsch? creehawk p.s. Es sind geschätzt 90 Änderungen die betroffen wären. Da würde würde ich mir das Stringreplace gerne sparen. |
AW: SetLocaleInfo
Hallo,
vielleicht hilft Dir die betreffende Zeile dieser Procedure zum Ändern Deiner DecimalSeparator-Einstellungen:
Delphi-Quellcode:
Grüße
Procedure ConfiguraRegiaoBR; // = Original-Name
// Setzt DecimalSeparator etc. // Quelle: // http://stackoverflow.com/questions/25109497/decimalseparator-in-sysutils-and-system-sysutils // von Rodrigo Garcia Var WFormatoBR: TFormatSettings; Begin WFormatoBR:= TFormatSettings.Create; WFormatoBR.DecimalSeparator := '.'; // ','; WFormatoBR.ThousandSeparator:= ','; // '.'; WFormatoBR.CurrencyDecimals := 2; WFormatoBR.DateSeparator := '/'; WFormatoBR.ShortDateFormat := 'dd/mm/yyyy'; WFormatoBR.LongDateFormat := 'dd/mm/yyyy'; WFormatoBR.TimeSeparator := ':'; WFormatoBR.TimeAMString := 'AM'; WFormatoBR.TimePMString := 'PM'; WFormatoBR.ShortTimeFormat := 'hh:nn'; WFormatoBR.LongTimeFormat := 'hh:nn:ss'; WFormatoBR.CurrencyString := 'R€'; // 'R$'; System.SysUtils.FormatSettings:= WFormatoBR; End;{Procedure ConfiguraRegiaoBR} {-------------------------------} Andreas |
AW: SetLocaleInfo
Wenn das Meiste einem gewissen Standard entspricht, dann einfach direkt Jenen laden und den Rest anpassen.
Delphi-Quellcode:
de-AT ginge auch, aber muß man aufpassen, dass diese Sprache auch installiert ist. Nur wegen den Punkten kann man aber auch einfach eine vorinstallierte Sprache nutzen.
FormatSettings := TFormatSettings.Create('en-US'); // oder := TFormatSettings.Invariant;
FormatSettings.CurrencyString := 'R€'; Aber anstatt global im Programm das umzustellen, vielleicht besser nur dort, wo man es wirklich braucht.
Delphi-Quellcode:
Noch schlimmer, als für sein eigenes ganzes Programm, ist nur noch global am Betriebssystem rumzupfuschen, für ALLE Programme,
var FS := TFormatSettings.Invariant;
X := StrToFloat('123.45', FS); also Finger weg von SetLocaleInfo :!: |
AW: SetLocaleInfo
Moin Moin.
Da werde ich wohl dann doch alles händisch nachbearbeiten müssen. Die Lösung von Andreas13 funktioniert, habe ich auch runtergekürzt auf die Zeile für den Decimalseperator. d.h. : Bei Programmstart der Seperator geprüft, wenn das ein Punkt ist umgestellt auf Komma, am Programmende zurück das Ganze. Aber wenn das mal nicht klappt.... Scheibenhonig. creehawk |
AW: SetLocaleInfo
Zitat:
Wenn du das programm-globle FormatSettings benutzt und sich irgendwas im System ändert (z.B. zwei Mal im Jahr bei der Zeitumstellung), dann lädt die VCL das neu ... außer bei UpdateFormatSettings=False. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:22 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