2017-02-17 95 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

相關問題