ShortDateFormat vs FormatSettings.ShortDateFormat?

时间:2014-05-17 03:34:27

标签: delphi datetime delphi-xe4 log4d

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

  

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

在这一行:

SetOption(DateFormatOpt, ShortDateFormat); 

一些谷歌搜索让我找到了将ShortDateFormat更改为FormatSettings.ShortDateFormat的解决方案,这导致了以下XE4编译代码:

SetOption(DateFormatOpt, FormatSettings.ShortDateFormat); 

但是,我并不真正理解为什么修复了为什么需要指定FormatSettings,因为我已经在我的使用声明中包含了SysUtils,其次,我我不确定如何重写这一行,继续向后兼容这个开源项目已经支持的Delphi版本。

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

3 个答案:

答案 0 :(得分:7)

最终在XE3中移除了全局SysUtils.ShortDateFormat,请参阅Global Variables

在现代Delphi版本中,也不建议使用全局FormatSettings变量记录。主要原因是它不是线程安全的(旧的全局ShortDateFormat也遭受了)。您应该定义自己的TFormatSettings变量,该变量在整个范围内都是一致的。

这也会使您的代码向后兼容。

但是,初始化FormatSetting记录的方法因Delphi版本而异。

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

GetLocaleFormatSettings(GetThreadLocale, FormatSettings);

在较新的版本(XE +)中:

FormatSettings := TFormatSettings.Create(GetThreadLocale); // Or one of the overloads

答案 1 :(得分:2)

基于我之前的互联网研究(你 可以 相信互联网上的所有东西,不管你吗?),旧的ShortDateFormat从Delphi XE开始不推荐使用。所以,是的,您可以通过IFDEF来解决问题。这就是我的所作所为。然而,根据彼得约翰逊的DelphiDabbler Blog TFormatSettings是在Delphi 7中引入的,但我无法证实这一点。

答案 2 :(得分:2)

修复编译器错误:

并将Log4D.pas中的第2211行更改为

SetOption(DateFormatOpt, {$IFDEF DELPHIXE_UP}FormatSettings.{$ENDIF}ShortDateFormat);

(我已向Log4D项目管理员提交了一些补丁请求)