【问题标题】:Formatsettings of client are changing when printing in Firemonkey在 Firemonkey 中打印时客户端的格式设置正在更改
【发布时间】:2015-02-26 11:28:00
【问题描述】:

我有一个数据快照服务器和客户端。服务器系统有十进制分隔符“.”。我不知道我的客户会有什么,所以我在我的程序中更改它。

FormatSettings.DecimalSeparator:='.';
FormatSettings.ThousandSeparator:=' ';

现在,当我从客户端打印时,FormatSettings 恢复为默认值。

  Printer.ActivePrinter.SelectDPI(600,600);
  //formatsettings.Decimalseperator is now ","

这是什么行为?这是一个错误吗?

Bonus Q:您如何为客户端和服务器保持相同的格式设置?

【问题讨论】:

    标签: delphi printing firemonkey delphi-xe6


    【解决方案1】:

    FormatSettings 是全局变量。它可以在任何地方更改,所有使用它的代码都会受到影响。

    使用TFormatSettings 的正确方法是,在进行格式化时不要依赖全局FormatSettings 变量并使用您自己的实例。这样您就可以确保您无法控制的其他代码不会更改它并弄乱您的格式。

    此外,您最好将固定格式设置仅用于存储目的,当您向用户展示您的数据时,您可以根据他们的区域设置使用格式设置,或者更好地允许他们自定义格式设置在您的应用程序中用于演示目的。

    var
      MyFormat: TFormatSettings;
    
    MyFormat := TFormatSettings.Create;
    MyFormat.DecimalSeparator:='.';
    MyFormat.ThousandSeparator:=' ';
    

    然后在所有格式化函数中使用它作为最后一个参数。

    对于使用全局 FormatSettings 变量的函数,唯一可以确保格式化正确的方法是在调用格式化函数之前将全局 FormatSettings 变量设置为您的值,并在完成后恢复旧值.

    仅供记录 StrToFloat 确实有过载,您可以在其中传递自己的设置。

    function StrToFloat(const S: string; const AFormatSettings: TFormatSettings): Extended;
    

    【讨论】:

    • 问题是某些系统方法,如 'StrToFloat' 使用 FormatSettings。我希望在客户端和服务器上具有相同的行为。因此启动格式设置。虽然我赞成你的方法。
    • StrToFloat 有过载,可以将您自己的设置作为参数。可能您使用的大多数功能都有它,只是您没有意识到它。
    • 我无法重现您关于 Printer.ActivePrinter.SelectDPI 更改全局 FormatSettings 的说法。但是,我没有 XE6,所以你可能是对的。如果您可以确认对Printer.ActivePrinter.SelectDPI 的简单调用会更改FormatSettings,那么这是一个错误,应该在quality.embarcadero.com 报告
    猜你喜欢
    • 1970-01-01
    • 2021-06-17
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多