gpt4 book ai didi

delphi - LOCALE_INVARIANT 的 GetLocaleFormatSettings 返回 Windows XP 德语下的用户设置

转载 作者:行者123 更新时间:2023-12-02 02:42:14 26 4
gpt4 key购买 nike

我出于交换目的写入文件的所有数字都使用以下代码:

GetLocaleFormatSettings(LOCALE_INVARIANT, fsInvariant);
FloatToStrF(Value, fsInvariant);

当我读入号码时,我使用这个

GetLocaleFormatSettings(LOCALE_INVARIANT, fsInvariant);
if TryStrToFloat(value, floatval, fsInvariant) then
result := floatVal

适用于 Windows 7,包括。德语版本,但在德语版本的 Windows XP 中失败。

问题似乎出在 GetLocaleFormatSettings 过程中,因为它为我提供了 LOCALE_INVARIANT 和 LOCALE_DEFAULT_USER 下的相同值。

这里有一些代码显示了我的问题:

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 函数 IsValidLCID(LCID, LCID_INSTALLED) 检查 LCID 是否有效。问题在于使用 LCID_INSTALLED 而不是 LCID_SUPPORTEDLOCALE_INVARIANT 受支持,但未安装在 Windows XP 系统上。因此,GetLocaleFormatSettings 例程始终恢复为用户 LCID。

解决这个问题的最佳方法是什么?编写我自己的 GetLocaleFormatSettings 例程?更改Delphi的SysUtils.pas文件中的代码?

最佳答案

早期版本的 Delphi 在正确初始化 TFormatSettings 时确实存在问题。例如,当未安装指定的 LCID(但这不会影响您的示例)。新版本中修复了与格式相关的错误。

在某些情况下,在单元的初始化部分中调用SetThreadLocale()GetFormatSettings()有助于解决格式问题。

仅供引用,在最近的版本中现已弃用 GetLocaleFormatSettings(),取而代之的是新的 TFormatSettings.Create() 方法:

procedure TForm1.FormShow(Sender: TObject);
var
fsInvariant : TFormatSettings;
fsLocaleUser : TFormatSettings;
begin
fsInvariant := TFormatSettings.Create(LOCALE_INVARIANT);
...
fsLocaleUser := TFormatSettings.Create(LOCALE_USER_DEFAULT);
...
end;

关于delphi - LOCALE_INVARIANT 的 GetLocaleFormatSettings 返回 Windows XP 德语下的用户设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16072108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com