打印QR报告时列出索引越界错误

时间:2012-07-31 12:13:19

标签: delphi delphi-2007

当访问Printer.Printers stringlist时,将QuickReport报告发送到选定的打印机时,我收到“List index out of bounds”之类的错误。

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。

1 个答案:

答案 0 :(得分:1)

如果您愿意,可以存储打印机名称,并将其分配到OnBeforePrint事件处理程序或报告的构造函数中。如果您不想对其进行硬编码,请将其存储在注册表或ini文件中。

type
  TMyForm = class(TForm)
  ....
  private
    FPrinterName: string;
  published
    ....
  end;

implementation

uses
  Printers;

procedure TMyForm.FormCreate(Sender: TObject);
begin
  // Set, or read from registry or ini file
  FPrinterName := 'My LaserJet Printer';
end;

procedure TMyForm.PrintReportButtonClick(Sender: Object);
begin
  // Create report and set up. Select stored printer, or set to default
  // printer if none is stored
  QuickRep1.PrinterSettings.PrinterIndex := Printers.IndexOf(FPrinterName);
  QuickRep1.Print;
  // Clean up - free report, etc.
end;