在Firemonkey中打印时,客户端的格式设置正在更改

r_j*_*r_j 4 printing delphi firemonkey delphi-xe6

我有一个datasnap服务器和客户端.服务器系统的小数分隔符为".".我不知道我的客户会有什么,所以我在我的程序中更改它.

FormatSettings.DecimalSeparator:='.';
FormatSettings.ThousandSeparator:=' ';
Run Code Online (Sandbox Code Playgroud)

现在,当我从客户端打印时,FormatSettings将恢复为Default.

  Printer.ActivePrinter.SelectDPI(600,600);
  //formatsettings.Decimalseperator is now ","
Run Code Online (Sandbox Code Playgroud)

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

奖金问:如何为客户端和服务器维护相同的格式设置?

Dal*_*kar 5

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

正确的使用方法TFormatSettings是,不要依赖全局FormatSettings变量,并在进行格式化时使用自己的实例.这样你就可以确保一些超出你控制范围的代码不会改变它并弄乱你的格式.

此外,最好将固定格式设置用于存储目的,当您向用户显示数据时,您可以根据其区域设置使用格式设置,甚至更好地允许他们自定义将在您的区域设置中使用的格式设置.申请用于演示目的.

var
  MyFormat: TFormatSettings;

MyFormat := TFormatSettings.Create;
MyFormat.DecimalSeparator:='.';
MyFormat.ThousandSeparator:=' ';
Run Code Online (Sandbox Code Playgroud)

然后在所有格式化函数中将它用作最后一个参数.

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

只是为了记录StrToFloat确实有超载,你可以通过自己的设置.

function StrToFloat(const S: string; const AFormatSettings: TFormatSettings): Extended;
Run Code Online (Sandbox Code Playgroud)