十进制舍入和打印机选择

时间:2014-04-28 14:10:12

标签: delphi decimal rounding

我使用来自http://cc.embarcadero.com/item/21909的Delphi RAD Studio 2010和DecimalRounding_JH1.pas。

它运行良好,但我不知道为什么,在一些旧机器(Pentium IV与Windows XP SP3)中,圆形在访问printer.printerindex后失败。我已经检查过问题不是Windows XP,因为它适用于具有此操作系统的其他计算机。

我做了一个简单的项目,用DecimalRounding_JH1(drHalfUp)围绕一个扩展值,带有两个小数(1.105 - >轮到1.11)。但如果我读print.printerindex,那么1.105轮到1.10)。

我认为它可能是“FDIV bug”,但使用“FDIV safe”进行编译并不能解决问题。

代码:

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;

提前感谢。

1 个答案:

答案 0 :(得分:3)

系统打印机库的某些部分有一个相当讨厌的习惯,即修改8087控制字。使用Printer的方法和属性后,应将其恢复为默认值。

例如,您可以这样写:

Set8087CW(Default8087CW);

我的代码库中的注释表明您只需在首次初始化VCL打印机代码后执行此操作。所以你可以在你的程序启动中处理这个问题。阅读Printer.PrinterIndex,然后立即将控制字设置为所需的值。