我使用来自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,然后立即将控制字设置为其所需的值。

09-11 18:59