delphi - GetLocaleFormatSettings for LOCALE_INVARIANT returns the users settings under Windows XP German -
all numbers write files exchange purpose use following code:
getlocaleformatsettings(locale_invariant, fsinvariant); floattostrf(value, fsinvariant); when read in number use this
getlocaleformatsettings(locale_invariant, fsinvariant); if trystrtofloat(value, floatval, fsinvariant) result := floatval that works under windows 7, incl. german version, fails in german version of windows xp.
the problem seems in getlocaleformatsettings procedure since gives me same values under locale_invariant , locale_default_user.
here code shows issue:
unit umain; interface uses windows, messages, sysutils, variants, classes, graphics, controls, forms, dialogs, grids, valedit; type tform1 = class(tform) vleditor: tvaluelisteditor; procedure formshow(sender: tobject); private { private declarations } public { public declarations } end; var form1: tform1; implementation {$r *.dfm} procedure tform1.formshow(sender: tobject); var fsinvariant : tformatsettings; fslocaleuser : tformatsettings; begin getlocaleformatsettings(locale_invariant, fsinvariant); vleditor.insertrow('invariant decimal seperator', fsinvariant.decimalseparator, true); vleditor.insertrow('invariant thousand seperator', fsinvariant.thousandseparator , true); vleditor.insertrow('invariant list seperator', fsinvariant.listseparator , true); getlocaleformatsettings(locale_user_default, fslocaleuser); vleditor.insertrow('locale decimal seperator', fslocaleuser.decimalseparator, true); vleditor.insertrow('locale thousand seperator', fslocaleuser.thousandseparator, true); vleditor.insertrow('locale list seperator', fslocaleuser.listseparator, true); end; end. when run exe in windows xp pro - sp3 - german, displays same characters same separators. in german windows 7, shows expected.
what missing here? how come gives different output?
thanks, thomas
update: getlocaleformatsettings checks first if lcid valid using kernel32 function isvalidlcid(lcid, lcid_installed). issue use of lcid_installed rather lcid_supported. locale_invariant supported, not installed on windows xp systems. therefore getlocaleformatsettings routine reverts users lcid.
what best way of fixing it? write own getlocaleformatsettings routine? change code in delphi's sysutils.pas file?
earlier versions of delphi did have problems initializing tformatsettings correctly. instance, d2010 have intialization bug regarding shortmonthnames, longmonthnames, shortdaynames, , longdaynames arrays when specified lcid not installed (but not affect example). there have been formatting-related bug fixes in newer releases.
in cases, calling setthreadlocale() , getformatsettings() in unit's initialization section helps address formatting issues.
fyi, getlocaleformatsettings() deprecated in recent releases, in favor of new tformatsettings.create() method:
procedure tform1.formshow(sender: tobject); var fsinvariant : tformatsettings; fslocaleuser : tformatsettings; begin fsinvariant := tformatsettings.create(locale_invariant); ... fslocaleuser := tformatsettings.create(locale_user_default); ... end;
Comments
Post a Comment