在访问 Printer.Printers 字符串列表时,将 QuickReport 报告发送到选定的打印机时,我会收到类似“列表索引超出范围”的错误。
exception class : EStringListError
exception message : List index out of bounds (6).
main thread ($1594c):
00479559 skdata.exe Classes 5060 TStringList.GetObject
004a258b skdata.exe Printers 581 TPrinter.GetPrinter
007ca744 skdata.exe QRPrntr 3208 TPrinterSettings.ApplySettings
007cb5bb skdata.exe QRPrntr 3995 TQRPrinter.BeginDoc
007be227 skdata.exe QuickRpt 4645 TCustomQuickRep.CreateReport
007be909 skdata.exe QuickRpt 4853 TCustomQuickRep.Print
00859bc7 skdata.exe PostLst 142 TPostSpecListReport.Print
我添加了显示打印机列表 (Printer.Printers) 在错误发生之前已更改的日志记录。我猜如果网络打印机关闭、网络关闭以及其他原因,打印机列表可能会发生变化。
如何处理这种情况?在 Delphi 中,所选打印机由 Printer.PrinterIndex 给出,但如果打印机列表发生更改,则该索引不再有效。
我只能想到一种解决方案,即在每次打印之前显示选择打印机对话框,换句话说,不要依赖 Printer.PrinterIndex 从一个打印作业到下一个打印作业是正确的。但这对用户来说可能很烦人。
理想情况下,应将所选打印机存储为 GUID 或按名称。那会让它更可靠。
我已经搜索了这个论坛以及 Embarcadero 论坛,但没有发现任何关于此类问题的提及。所以也许我忽略了一些简单的东西?
我使用 Delphi 2007 和 QuickReport 5。