gpt4 book ai didi

delphi - 为整个 Delphi 应用程序设置ThreadLocale

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

我的 Delphi (XE 10) 程序使用非 unicode(单字节)旧版 Firebird 数据库(字符集 NONE),因此其数据(从数据库读取或保存到数据库中)取决于非 unicode 程序的 Windows 区域设置。根据此 Windows 设置,相同的数据库字符可以在程序中显示为\u0101(正确)或\u0432(不正确)。 IBX作为数据库访问技术。

我的程序仅适用于特定的本地非unicode程序,并且客户端可以接受。问题是 - 如何让程序感受到特定的预定义区域设置,而不管 Windows 设置如何?

我想我应该为此使用SetThreadLocale。但是在哪里调用这个函数?在主窗体的初始化部分调用这个函数是否足够,或者我应该在项目源文件(应用程序初始化的地方)中调用它,或者我应该调用它在每个模块的初始化部分吗?

由于评论,我了解到 GetThreadLocale returns different value than GetUserDefaultLCID?我现在发现我应该多写一些代码:

SetThreadLocale(my_preferred_locale_id); 
SysLocale.DefaultLCID := my_preferred_locale_id;
GetFormatSettings;

但主要问题仍然存在 - 在哪里放置此代码 - 我应该将其放置在多个位置。我有 WebSnap 应用程序,我想它可以在后台进行自动且复杂的胎面管理。代码应该放在哪里?

没有任何帮助:

  • 将 lc_ctype=WIN1257 添加到 TIBDatabase.Params
  • 设置 SetThreadLocale...这里、那里和任何地方
  • 设置项目选项 - 版本信息 - 语言 - 区域设置 ID

https://github.com/xupefei/Locale-Emulator Locale Emulator 是解决该问题的唯一工具,但为什么 Delphi 不允许在没有外部工具的情况下执行此操作?

最佳答案

正如我也在 Firebird 支持邮件列表上发布的那样(奇怪的是,那里的海报有不同的名字,但有同样的问题):

在我看来,除了使用 NONE 的数据库之外,您还使用 NONE 字符集进行连接。要解决此问题,显式指定 lc_ctype = win1257 就足够了。

我不太了解 Delphi,但假设 Delphi 内部使用 unicode,那么它应该可以工作。

关于delphi - 为整个 Delphi 应用程序设置ThreadLocale,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42154760/

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