Delphi ShortDateFormat vs FormatSettings.ShortDateFormat?

Delphi ShortDateFormat vs FormatSettings.ShortDateFormat?,delphi,datetime,delphi-xe4,log4d,Delphi,Datetime,Delphi Xe4,Log4d,在试图让Log4D在XE4中编译时,我看到 [dcc32错误]Log4D.pas(2139):E2003未声明的标识符:“ShortDateFormat” 在这一行: SetOption(DateFormatOpt, ShortDateFormat); 通过谷歌搜索,我找到了将ShortDateFormat更改为FormatSettings.ShortDateFormat,从而在XE4上编译以下代码的解决方案: SetOption(DateFormatOpt, FormatSettings.

在试图让Log4D在XE4中编译时,我看到

[dcc32错误]Log4D.pas(2139):E2003未声明的标识符:“ShortDateFormat”

在这一行:

SetOption(DateFormatOpt, ShortDateFormat); 
通过谷歌搜索,我找到了将
ShortDateFormat
更改为
FormatSettings.ShortDateFormat
,从而在XE4上编译以下代码的解决方案:

SetOption(DateFormatOpt, FormatSettings.ShortDateFormat); 
然而,我真的不明白为什么这会解决为什么需要指定
FormatSettings
的问题,因为我已经在uses语句中包含了
SysUtils
,其次,我不确定如何重写这一行以继续与这个开源项目已经支持的Delphi版本向后兼容


我想我可以为Delphi引入的任何版本的
FormatSettings
,在该参数或代码行周围添加一个IFDEF,但我甚至不确定那是什么版本的Delphi,更不用说这是解决这个问题的好方法还是坏方法了。

基于我之前的互联网研究(你可以相信互联网上的一切,不是吗?),旧的ShortDateFormat从Delphi XE开始就被弃用了。因此,是的,您可以使用IFDEF来解决这个问题。这就是我所做的。然而,根据Peter Johnson的说法,Delphi 7中引入了TFormatSettings,但我无法确认这一点。

全局
系统utils。ShortDateFormat
最终在XE3中被删除,请参阅

在现代Delphi版本中,也不建议使用全局
FormatSettings
变量记录。主要原因是它不是线程安全的(旧的全局
ShortDateFormat
也会遇到这种情况)。您应该定义自己的
t格式设置
变量,使其在整个范围内保持一致

这也将使您的代码向后兼容

但是,初始化
格式设置
记录的方式因Delphi版本而异

在旧版本(D7+)上,使用:

在较新版本(XE+)中:


要修复编译器错误,请执行以下操作:

  • 从下载更新版本的绝地公司
  • 将新的绝地公司放入Log4D源文件夹
并将Log4D.pas中的第2211行更改为

SetOption(DateFormatOpt, {$IFDEF DELPHIXE_UP}FormatSettings.{$ENDIF}ShortDateFormat);
(我已经向Log4D项目管理员提交了一些补丁请求)

FormatSettings := TFormatSettings.Create(GetThreadLocale); // Or one of the overloads
SetOption(DateFormatOpt, {$IFDEF DELPHIXE_UP}FormatSettings.{$ENDIF}ShortDateFormat);