Delphi 在Firemonkey中打印时,客户端的格式设置正在更改
我有一个datasnap服务器和客户端。服务器系统的小数点分隔符为“”。我不知道我的客户会有什么,所以我在我的计划中改变了它Delphi 在Firemonkey中打印时,客户端的格式设置正在更改,delphi,printing,firemonkey,delphi-xe6,Delphi,Printing,Firemonkey,Delphi Xe6,我有一个datasnap服务器和客户端。服务器系统的小数点分隔符为“”。我不知道我的客户会有什么,所以我在我的计划中改变了它 FormatSettings.DecimalSeparator:='.'; FormatSettings.ThousandSeparator:=' '; 现在,当我从客户端打印时,格式设置恢复为默认设置 Printer.ActivePrinter.SelectDPI(600,600); //formatsettings.Decimalseperator is n
FormatSettings.DecimalSeparator:='.';
FormatSettings.ThousandSeparator:=' ';
现在,当我从客户端打印时,格式设置恢复为默认设置
Printer.ActivePrinter.SelectDPI(600,600);
//formatsettings.Decimalseperator is now ","
这是什么行为?这是虫子吗
额外问题:如何维护客户端和服务器的相同格式设置?
formatsettings
是全局变量。它可以在任何地方更改,使用它的所有代码都将受到影响
使用t格式设置的正确方法是,不要依赖全局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
changes globalFormatSettings
。但是,我没有XE6,所以您可能是对的。如果您可以确认对Printer.ActivePrinter.SelectDPI
changesFormatSettings
的简单调用,则这是一个错误,应在