交換目的でファイルに書き込むすべての番号は、次のコードを使用します。
GetLocaleFormatSettings(LOCALE_INVARIANT, fsInvariant);
FloatToStrF(Value, fsInvariant);
数字を読むときはこれを使います
GetLocaleFormatSettings(LOCALE_INVARIANT, fsInvariant);
if TryStrToFloat(value, floatval, fsInvariant) then
result := floatVal
これは、Windows 7 で動作します。ドイツ語版では失敗しますが、ドイツ語版の Windows XP では失敗します。
LOCALE_INVARIANT と LOCALE_DEFAULT_USER に対して同じ値が得られるため、問題は GetLocaleFormatSettings プロシージャにあるようです。
ここに私の問題を示すいくつかのコードがあります:
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.
Windows XP Pro - SP3 - GERMAN で exe を実行すると、同じ区切り文字に対して同じ文字が表示されます。ドイツの Windows 7 では、期待どおりに表示されます。
ここで何が欠けていますか?なぜ異なる出力が得られるのですか?
ありがとう、トーマス
更新:
GetLocaleFormatSettings
最初に、kernel32 関数を使用して LCID が有効かどうかを確認しますIsValidLCID(LCID, LCID_INSTALLED)
。問題は、LCID_INSTALLED
ではなくの使用にありLCID_SUPPORTED
ます。はLOCALE_INVARIANT
サポートされていますが、Windows XP システムにはインストールされていません。したがって、GetLocaleFormatSettings
ルーチンは常にユーザーの LCID に戻ります。
それを修正する最良の方法は何ですか?独自の GetLocaleFormatSettings ルーチンを作成しますか? Delphi の SysUtils.pas ファイルのコードを変更しますか?