Einzelnen Beitrag anzeigen

HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#12

AW: Probleme mit FormatSettings.DecimalSeparator

  Alt 13. Jan 2017, 12:48
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.
  Mit Zitat antworten Zitat