为整个Delphi应用程序设置ThreadLocale



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

我的程序只适用于特定的本地非Unicode程序,这对客户端来说是可以接受的。问题是-无论Windows设置如何,我如何让程序感受到特定的预定义区域设置

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

由于评论,我知道GetThreadLocale返回的值与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-EmulatorLocale Emulator是唯一解决这个问题的工具,但为什么Delphi不允许在没有外部工具的情况下这样做?

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

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

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

最新更新