【问题标题】:How to use TFormatSettings.Create without being specific to a platform?如何在不特定于平台的情况下使用 TFormatSettings.Create?
【发布时间】:2012-02-01 16:57:48
【问题描述】:

我在 Delphi XE 中有以下内容:

fSettings := TFormatSettings.Create(LOCALE_USER_DEFAULT);

但我总是在编译时收到警告:

W1002 Symbol 'Create' is specific to a platform

这样做的正确方法是什么,这样我就不会收到警告?

【问题讨论】:

    标签: delphi delphi-xe


    【解决方案1】:

    你有两个选择

    1) 使用使用字符串而不是TLocaleID的重载版本

    class function Create(const LocaleName: string): TFormatSettings; overload; static;
    

    2) 在本地禁用警告

    {$WARN SYMBOL_PLATFORM OFF}
        fSettings := TFormatSettings.Create(LOCALE_USER_DEFAULT);
    {$WARN SYMBOL_PLATFORM ON}
    

    【讨论】:

    • 选项 3. 全局禁用警告。如果您从不为 Windows 以外的平台构建,那么启用它根本没有多大意义。
    • 如果我选择使用字符串版本,相当于LOCALE_USER_DEFAULT的字符串是什么?
    • 尝试使用空字符串或不带参数的构造函数,这将在内部调用GetThreadLocale 函数。请注意对SetThreadLocale 的调用,因为可以更改此函数的结果。
    【解决方案2】:

    TFormatSettings.Create 有不同的重载。具有 LCID 的那个是特定于 Windows 的。不带任何参数的和将语言环境名称作为字符串的更可移植。

    或者,如果您知道您的软件将永远不会用于除 Delphi for Windows 之外的任何其他用途,那么您可以取消针对特定平台单元和过程的警告。 VCL 包含现在不受支持的平台的痕迹,例如 Linux (Kylix) 和 .NET (Delphi.NET),由于它们已经死了,所以让您的代码可移植到这些平台可能是浪费时间。

    【讨论】:

      【解决方案3】:

      我的代码现在写成如下:

      {$IFDEF VER220}
          FormatSettings := TFormatSettings.Create(GetThreadLocale);
      {$ELSE}
          GetLocaleFormatSettings(GetThreadLocale, FormatSettings);
      {$ENDIF}
      

      您可能希望为将来的适当版本调整该 IFDEF,但它提供了这个想法。

      【讨论】:

      • 这个 sn-p 实际上比编译器抱怨的平台更具体。
      • @user539484 也许,但是 IIRC 我是从帮助中得到的,推荐的方式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 2018-08-03
      相关资源
      最近更新 更多