Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Probleme mit FormatSettings.DecimalSeparator (https://www.delphipraxis.net/191392-probleme-mit-formatsettings-decimalseparator.html)

Hunni 10. Jan 2017 17:22

Probleme mit FormatSettings.DecimalSeparator
 
Hallo,

der Befehl FormatSettings.DecimalSeparator gibt mir machmal den Falschen Wert zurück

Wir haben mehrere Win7 (64bit) Rechner, die mir hin und wieder anstelle eines ',' einen '.' zurückgeben

Ist das ein bekanntes Problem ?

Lösen kann ich das Problem meistens dadurch, das ich in der System Einstellung unter "Region Sprache" ein anders Land auswähle und dann wieder zurück auf Deutsch wechsel


Beispiel
Code:
  label1.Caption := '1' + FormatSettings.DecimalSeparator + '00';

Gruß

Torsten

Zacherl 10. Jan 2017 17:29

AW: Probleme mit FormatSettings.DecimalSeparator
 
Reine Spekulation, aber das klingt doch so, als ob das Problem bei Windows liegen würde. Hast du auf einem der betroffenen Rechner mal geschaut, ob da vielleicht wirklich '.' als Trennzeichen eingestellt war?

mm1256 10. Jan 2017 17:43

AW: Probleme mit FormatSettings.DecimalSeparator
 
Dieses Phänomen hatte ich schon des öfteren mit HP-Rechnern. Allerdings mit der Einschränkung, dass dies nicht "hin und wieder" passierte, sondern ein einmaliger Vorgang nach der Auslieferung bzw. erstmaligen Inbetriebnahme war. D.h. wenn man einmalig die Ländereinstellung gewechselt, übernommen, und wieder zurück gewechselt hat, dann war es behoben.

Und, richtig, wie Zacherl schon geschrieben hat, das ist ein Windows Problem, das nichts mit Delphi zu tun hat.

Hunni 10. Jan 2017 17:52

AW: Probleme mit FormatSettings.DecimalSeparator
 
Zitat:

Zitat von Zacherl (Beitrag 1358608)
Reine Spekulation, aber das klingt doch so, als ob das Problem bei Windows liegen würde. Hast du auf einem der betroffenen Rechner mal geschaut, ob da vielleicht wirklich '.' als Trennzeichen eingestellt war?

Hi,

Ja, In den Windows Einstellungen ist immer ein ',' eingetragen

Eigentlich habe ich auch gelesen, das dieser Fehler durch einmaliges ändern der System Einstellungen behoben sein soll

Aber der Fehler tritt leider immer wieder mal sporadisch auf


Gruß

Torsten

HolgerX 10. Jan 2017 18:14

AW: Probleme mit FormatSettings.DecimalSeparator
 
Das ist ein bekannte Bug von Windows7.

Wenn Windows 7 als Englich installiert wurde und dann das deutsche Sprachpaket darüber kommt es zu diesem Problem.

Es gibt unter Windows 7 einmal die System-Sprache und einmal die User-Sprache.

Auch wenn in deinem Profil DE eingestellt ist und der richtige Dezimalseparator angezeigt wird, nimmt u.a. Delphi nicht die User-Sprache, sondern die System-Sprache.
Vor Windows 7 gab es nur die Systemsprache.

Eine einfache Fehlerbehandlung ist, in die Spracheinstellungen zu gehen und dort "auf Standard zurücksetzen" machen.
Dann wird auch die System-Sprache richtig eingestellt und es kommt der richtige Dezimalseparator.

Der Bug wird übrigens bei einem Upgrade von Win7 auf Win10 sogar mitgenommen ;)

Wurde hier übrigens schon behandelt:
http://www.delphipraxis.net/156447-d...lsettings.html
http://www.delphipraxis.net/160539-d...p-vs-win7.html

t.roller 10. Jan 2017 18:37

AW: Probleme mit FormatSettings.DecimalSeparator
 
Zitat:
ms-help://embarcadero.rs_xe7/libraries/System.SysUtils.TFormatSettings.Create.html
Ein TFormatSettings-Datensatz muss vor der Verwendung initialisiert werden. Mit Create können Sie alle Felder gemäß des angegebenen Gebietsschemas füllen.

Delphi-Quellcode:
procedure TForm1.Button11Click(Sender: TObject);
var FS: TFormatSettings;
begin
  FS := TFormatSettings.Create('de-DE');
  Caption:= '1'+ FS.DecimalSeparator+'00';
end;

procedure TForm1.Button12Click(Sender: TObject);
var FS: TFormatSettings;
begin
  FS := TFormatSettings.Create('en-US');
  Caption:= '1'+ FS.DecimalSeparator+'00';
end;

Hunni 10. Jan 2017 19:55

AW: Probleme mit FormatSettings.DecimalSeparator
 
Zitat:

Zitat von t.roller (Beitrag 1358615)
Zitat:
ms-help://embarcadero.rs_xe7/libraries/System.SysUtils.TFormatSettings.Create.html
Ein TFormatSettings-Datensatz muss vor der Verwendung initialisiert werden. Mit Create können Sie alle Felder gemäß des angegebenen Gebietsschemas füllen.

Delphi-Quellcode:
procedure TForm1.Button11Click(Sender: TObject);
var FS: TFormatSettings;
begin
  FS := TFormatSettings.Create('de-DE');
  Caption:= '1'+ FS.DecimalSeparator+'00';
end;

procedure TForm1.Button12Click(Sender: TObject);
var FS: TFormatSettings;
begin
  FS := TFormatSettings.Create('en-US');
  Caption:= '1'+ FS.DecimalSeparator+'00';
end;

Hallo

Ok, ich werde es mal ausprobieren


Gruß

Torsten

Stevie 12. Jan 2017 15:53

AW: Probleme mit FormatSettings.DecimalSeparator
 
Da FormatSettings eine globale Variable ist, würde ich mal untersuchen, ob nicht irgendwelcher Code, darauf herumschreibt - wurde früher durchaus gern gemacht, einfach mal temporär DecimalSeparator umändern, eine Methode aufrufen und danach wieder zurück ändern - thread sicherheit, was ist das?

bra 12. Jan 2017 16:10

AW: Probleme mit FormatSettings.DecimalSeparator
 
Wir hatten das Problem auch schon ein paarmal. Ich vermute hier werden irgendwelche Einstellungen (z.B. Registry) gelesen, die nicht richtig initialisiert sind. Einzige mir bekannte Lösung: Das schon erwähnte Umstellen der Sprache auf was anderes und zurückstellen auf Deutsch.

himitsu 12. Jan 2017 16:35

AW: Probleme mit FormatSettings.DecimalSeparator
 
Das Problem ist einfach.
Es gibt mehrere Speicherorte für diese Settings und bei einigen "vorinstallierten" Windowsen werden/wurden nicht alle Speicherorte richtig initialisiert.
Die eine API liest von da, eine andere von dort, manche Programme gehen garnicht über APIs und denken sie sind schlauer, wenn sich selber in der Registrie rumfummeln und am Ende wundert sich jemand, wenn er die "falschen" Settings ausliest.

Nach dem Ändern über den Windowsdialog steht es dann aber überall richtig drin.

Manchmal werden Speicherorte verschoben oder Neue erfunden, weil z.B. früher ein Setting global war und nun userabhängig ist ......

Hunni 13. Jan 2017 11:18

AW: Probleme mit FormatSettings.DecimalSeparator
 
Hi,


ich habe es jetzt ers einmal so gelöst

ich lese mir beim Programmstart den Wert aus GetLocaleChar(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, ',') aus und verwende diesen im Programm

Ich hoffe das ich damit jetzt das Problem gelöst habe.

Die Zeit wird es zeigen


Gruß

Torsten

HolgerX 13. Jan 2017 12:48

AW: Probleme mit FormatSettings.DecimalSeparator
 
Hmm..

Ich hatte mir für das Problem mit Windows 7 eine kleine Unit erstellt, welche ich einfach in die DPR mit aufnehme und gut ist es.
Das mache ich bei allen Kunden so, welche gemischte Systeme einsetzen, sprich EN-Windows7 installieren und dann per Sprachpaket auf DE umstellen.

Delphi-Quellcode:
unit UBugFixWin7UserDefaultLCID;

interface

implementation

uses
  Windows;

//WM_SETTINGCHANGE   SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0&, 0&)

initialization


(*
BugFix Win7

Muss in DPR an erster Stelle stehen!



http://stackoverflow.com/questions/1767946/getthreadlocale-returns-different-value-than-getuserdefaultlcid

The relevant API calls all operate on registry values that can be found at HKCU\Control Panel\International.
The value " Locale " is maintained for backward compatibility reasons and under normal circumstances is kept
in synch with its newer counterpart called " LocaleName ". Under Windows 7 at least, this synch process
however doesn't work where processes are being run as another user (i.e. RunAs or Impersonation).

This seems to be the case during installation, where the installer is launched from an existing windows
session. It does however seem to work correctly if you've booted from the install CD.

GetThreadLocale gets its value from Thread Information Block or Thread Environment Block (TIB or TEB)
See: http://en.wikipedia.org/wiki/Thread_Environment_Block For both Vista and Windows 7, the TIB is
initialised with the HKCU\Control Panel\International\Locale registry entry at logon. This becomes
the default Locale for all threads created during the session. Changing this registry value during
a session has no effect on the value returned by the GetThreadLocale API call. The user must log out
and log in again to see a change. This is the API call that Delphi uses as the basis to initialize
all its locale format strings ( See SysUtils.GetFormatSettings method), from which all date fields are formatted.

GetUserDefaultLCID: in Vista, bases its return value on the HKCU\Control Panel\International\Locale registry entry.
In Windows 7, bases its return value on the HKCU\Control Panel\International\LocaleName registry entry.
The respective registry entry can be changed during a session and the result is immediately reflected
in this API call return value.

SetThreadLocale updates the TIB to reflect the locale provided in the parameter to this call.
Note that this only ever effects the thread the API call is executed from. The API calls
SetThreadLocale(LOCALE_USER_DEFAULT) and SetThreadLocale(GetUserDefaultLCID) are functionally
equivalent. They both derive the source locale as described in the GetUserDefaultLCID API call above.

*)

  SetThreadLocale(GetUserDefaultLCID);

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz