我使用来自http://cc.embarcadero.com/item/21909的Delphi RAD Studio 2010和DecimalRounding_JH1.pas。
它运行良好,但我不知道为什么在某些旧计算机(带有Windows XP SP3的奔腾IV)中,访问printer.printerindex后,回合失败。我已检查问题是否出在Windows XP上,因为它可以在具有此OS的其他计算机上使用。
我做了一个简单的项目,将带有DecimalRounding_JH1(drHalfUp)的扩展值四舍五入为两个小数点(1.105->舍入为1.11)。但是,如果我阅读了printer.printerindex,则1.105会四舍五入为1.10)。
我以为可能是“ FDIV错误”,但是使用“ FDIV安全”进行编译并不能解决问题。
代码:
var d1,d2:extended;
i:integer;
begin
d1:=1.105;
d2:=DecimalRounding_JH1.DecimalRoundExt(d1,2,drHalfUp);
memo1.lines.add(FloatToStr(d2)); // --> shows 1.11 (OK)
i:=Printer.printerindex;
d2:=DecimalRounding_JH1.DecimalRoundExt(d1,2,drHalfUp);
memo1.lines.add(FloatToStr(d2)); // --> shows 1.10 (ERROR!!!)
...
我知道这很奇怪,但是我已经对其进行了测试,就像我说的那样。
我能做什么?
编辑:
如果我在
Printer.printerindex:=1;
之前添加(例如)i:=Printer.printerindex;
,那么它再次运行良好。读取打印机单元,区别在于是否执行“ SetToDefaultPrinter”:function TPrinter.GetPrinterIndex: Integer;
begin
if FPrinterIndex = -1 then SetToDefaultPrinter;
Result := FPrinterIndex;
end;
提前致谢。
最佳答案
系统打印机库的某些部分有修改8087控制字的讨厌习惯。使用Printer
的方法和属性后,应将其恢复为默认值。
例如,您可以这样写:
Set8087CW(Default8087CW);
我的代码库中的注释建议您仅在首次初始化VCL打印机代码后才需要执行此操作。因此,您可以在程序启动时进行处理。读取
Printer.PrinterIndex
,然后立即将控制字设置为其所需的值。