【问题标题】:Change the regional settings format for Sysem.Variants.VarToWideStr更改 Sysem.Variants.VarToWideStr 的区域设置格式
【发布时间】:2019-11-29 08:06:53
【问题描述】:

我的应用程序上的第三方组件 (FastReports) 广泛使用 System.Variants.VarToWideStr 函数,这很好,只是它忽略了我需要该应用程序使用的区域设置。

例子:

FormatSettings.ShortDateFormat := 'dd/mm/yyyy';
ShowMessage(VarToWideStr(Date));
FormatSettings.ShortDateFormat := 'yyyy/mm/dd';
ShowMessage(VarToWideStr(Date));

此代码始终返回相同的字符串,忽略我指示要使用的应用程序的区域设置。

您知道更改应用程序(具体来说是 VarToWideStr)将要使用的区域设置的另一种方法吗?

【问题讨论】:

  • Delphi 的哪个版本?日期如何声明? VarDate 还是 TDateTime?是否存在具有第二个 TFormtaSettings 参数的 VarToWideStr 的重载版本?
  • 嗨@nolaspeaker。它是 Delphi 10.1(它在标签中),Date 是 SysUtils 函数,所以是 TDateTime。不,VarToWideStr 没有重载版本,无论如何我都无法使用它,因为这些调用不在我的代码中,而是在第三方组件中。

标签: delphi date-formatting delphi-10.1-berlin


【解决方案1】:

我认为您被 Variants 单元和 FastReport 的糟糕设计搞砸了。 VarToWideStr 调用 VarToWideStrDef,后者调用隐式 _VarToWStr,然后是 DateToWStrViaOS,最后是来自单元 System.VarUtilsVarBStrFromDate

事实上VarBStrFromDate 是对函数的引用,它的实现依赖于编译器。在 Windows 32/64 上,这只是来自 oleaut32.dll 的对 VarBstrFromDate 的引用。非 Windows 编译器回退到通过 DateTimeToStr(单参数不变量)转换值,它使用全局格式设置和 'C' format specifier 来格式化值。

没有很好的解决方法,因为所有这些例程都过多地依赖于全局状态。幸运的是 (??) 您可以将 VarBStrFromDate 指向您自己的实现。您可以从单元System.VarUtils 的函数BackupVarBStrFromDate 中看到的非Windows 平台的默认实现中获得灵感。然后你可以这样做:

uses
  System.SysUtils, System.Variants, System.VarUtils, System.DateUtils;

function MyVarBstrFromDate(dateIn: TDateTime; LCID: Integer; dwFlags: Integer;
  out bstrOut: WideString): HRESULT; stdcall;
begin
  if LCID = VAR_LOCALE_USER_DEFAULT then
  begin
    bstrOut := DateTimeToStr(dateIn);
    Result := VAR_OK;
  end
  else
    Result := VAR_NOTIMPL;
end;

{ ... }

System.VarUtils.VarBstrFromDate := MyVarBstrFromDate;
FormatSettings.ShortDateFormat := 'yyyy-mm-dd';
FormatSettings.LongTimeFormat := 'hh:nn:ss';
Writeln(VarToWideStr(EncodeDate(2019, 11, 29)));
Writeln(VarToWideStr(EncodeDateTime(2019, 11, 29, 10, 30, 50, 700)));

得到结果:

2019-11-29
2019-11-29 10:30:50

您需要注意,这会改变整个应用程序中依赖VarBstrFromDate 的所有例程的行为。

VarToStr 也是如此。另见here,作者建议在转换为字符串之前从变量中提取日期值。

【讨论】:

  • 谢谢彼得,乍一看似乎很有魅力。
猜你喜欢
  • 2016-03-12
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多