2017-02-17 192 views
-1

当没有Windows默认打印机设置时,需要打开打印机对话框。当设置Windows默认打印机时,它可以正常工作。未设置Windows默认打印机时出现“没有选择默认打印机”错误

TPrintDialog *dlgPrint = new TPrintDialog(frmDisplayDetail); 
if(dlgPrint->Execute()) { //code here } 

但是,如果没有默认的打印机设置在Windows中,dlgPrint->Execute()抛出一个异常:

有选择

要检查的默认打印机指数没有默认打印机,我用Printer()->PrinterIndex

错误E2122函数调用的地址XXX

由未处理的异常XXX终止难道我做错了什么:当没有Windows打印机设置这个值可能不可?请提出解决方案。

+0

太宽泛。请发布[MVCE](http://stackoverflow.com/help/mcve)。 – tambre

+0

@tambre已更新。 – Santhosh

回答

2

例外“目前选定默认打印机”由TPrinter::SetToDefaultPrinter()方法仅抛出,当任一:

  • 在Win32 API与(无证枚举时EnumPrinters()函数失败与ERROR_INVALID_NAME错误代码)PRINTER_ENUM_DEFAULT标志。

  • TPrinter::Printers列表不包含默认打印机。如果上面的EnumPrinters()未报告默认设备,那么将从Win32 API GetDefaultPrinter()函数(Delphi/C++ Builder 2009及更高版本)或device[windows]部分%windir%\win.ini(Delphi/C++ Builder)中查询默认值2007年及以前)。

TPrinter::SetToDefaultPrinter()只调用由:

  • TPrinter::PrinterIndex吸气如果FPrinterIndex成员目前-1。

  • TPrinter::PrinterIndex setter如果FPrinterIndex成员当前为-1,或者属性设置为-1。

TPrintDialog::Execute()(使用Win32 API的PrintDlg()功能)首先调用TPrinter::GetPrinter()得到一个句柄到当前所选的打印机,然后用它来初始化对话框(通过PRINTDLG::hDevMode场)的DEVMODETPrinter::GetPrinter()将读取TPrinter::PrinterIndex属性,因此如果没有当前选定的打印机并且没有默认打印机,则引发异常。

如果没有配置默认打印机,你基本上是出于运气,因为你不能连TPrinter::PrinterIndex属性设置为一个值> = 0,因为它会首先,如果新值电流匹配检查之前调用SetToDefaultPrinter()值。

TPrinter在Windows中没有配置默认打印机时,存在很长的故障/崩溃历史。要解决此问题,应该直接调用Win32 API PrintDlg()函数。至少可以手动呼叫TPrinter::GetPrinter()(获取最初的DEVMODE)并将其包装在try/catch区块中以放弃它可能抛出的任何异常。

如果对话结果指示成功,您可以手动调用TPrinter::SetPrinter()将选定的打印机选项分配到TPrinter以供后续打印。

0

我检查打印机是否存在对话框使用前:

// check printer interface 
TPrinter *prn = Printer(); 
int pxs,pys,i=0; 
if (prn==NULL)i=1; 
if (prn->Printers==NULL) i=1; 
if (prn->Printers->Count<=0) i=1; 
if (i) return; 
// use dialog 
dlg_print->Options.Clear(); 
dlg_print->Options<<poPrintToFile; 
if (!dlg_print->Execute()) return; 
// print 
prn = Printer(); 
pxs=prn->PageWidth; 
pys=prn->PageHeight; 
prn->BeginDoc(); 
for (i=0;i<dlg_print->Copies;i++) 
    { 
    if (i) prn->NewPage(); 
    // here render page into prn->Canvas as image in resolution pxs,pys 
    } 
prn->EndDoc(); 

其中dlg_print是我的对话框放置在窗体上。

+0

我在打开对话框之前检查打印机。在上面的代码中,当没有选择Windows默认打印机时,dlg_print-> Execute()将返回一个异常“没有选择默认打印机”。这就是我提到的问题。 – Santhosh

+0

@Santhosh只是一个愚蠢的问题,但你检查'dlgPrint'是否为空(因为你创建它动态)?它究竟在代码中(我希望不在表单构造函数中)? – Spektre

+0

是的,我检查过。它不是空的。如果Printer() - > PrinterIndex属性正确设置了index,dlg-> Execute()可以正常工作。我在PASCAL代码 – Santhosh

相关问题