我使用来自 http://cc.embarcadero.com/item/21909 的 Delphi RAD Studio 2010 和 DecimalRounding_JH1.pas .
它工作得很好,但我不知道为什么,在一些旧机器(带有Windows XP SP3的Pentium IV)中,访问printer.printerindex后回合失败。我已检查问题不是 Windows XP,因为它可以在其他具有此操作系统的计算机上运行。
我制作了一个简单的项目,使用 DecimalRounding_JH1 (drHalfUp) 对扩展值进行四舍五入,保留两位小数(1.105 -> 四舍五入到 1.11)。但如果我读取 Printer.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!!!)
...
我知道这很奇怪,但我测试过,正如我所说。 我能做什么?
编辑:
如果我在 i:=Printer.printerindex;
之前添加 Printer.printerindex:=1;
(例如),那么它又可以正常工作。读取打印机单元,区别在于是否执行“SetToDefaultPrinter”:
function TPrinter.GetPrinterIndex: Integer;
begin
if FPrinterIndex = -1 then SetToDefaultPrinter;
Result := FPrinterIndex;
end;
提前致谢。
最佳答案
系统打印机库的某些部分有修改 8087 控制字的相当讨厌的习惯。使用Printer
的方法和属性后应将其恢复为默认值。
例如,您可以这样写:
Set8087CW(Default8087CW);
我的代码库中的注释建议您只需要在 VCL 打印机代码首次初始化后执行此操作。所以你可以在程序启动时处理这个问题。读取Printer.PrinterIndex
,然后立即将控制字设置为其所需的值。
关于delphi - 小数舍入和打印机选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23343358/