線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1147
推到 Plurk!
推到 Facebook!

如何在98下按button要印出三種不同格式的報表?

缺席
huangeider
高階會員


發表:288
回覆:492
積分:231
註冊:2003-02-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-23 22:05:45 IP:210.201.xxx.xxx 未訂閱
小弟在win2000下自訂三種紙張格式qreport中紙張設定用default 分別用三個按鈕控制印出的三種自訂格式可以做得到程式如下(某人的程式) 但在win98這個程式會有錯誤 訊息是無法取得預設印表機 且win98只有自訂的那種紙張格式無法做到可自訂三種格式 如在同一個預設印表機下作業就不能用三個按鈕印出三種自訂格式 請教在win98要用三個按鈕印出三種或多種自訂格式應如何作? 先在專案新增一個新單元(名為 WinSpool2), 因為 Delphi 5 無宣告 GetDefaultPrinter (取得預設印表機). unit WinSpool2; interface uses Windows, WinSpool; function GetDefaultPrinter(pszBuffer : PChar; var pcchBuffer : DWORD) : BOOL; stdcall;//(uses 下) implementation uses function GetDefaultPrinter; external winspl name 'GetDefaultPrinterA'; // 自動設定紙張大小程式 procedure TForm1.Button6Click(Sender: TObject); var _PPrinterInfo2 : PPrinterInfo2; pPrinterName : PChar; sPrinterName, sFormName : String; hPrinter : THandle; cbNeeded : DWORD; dwBufferSize : DWORD; begin sFormName := 'Letter'; // 取得預設印表機名稱 if not GetDefaultPrinter(nil, dwBufferSize) then begin case GetLastError of // 即使呼叫成功也會有此一錯誤(Buffer 不足), 我只是要取得 Buffer 大小所以忽略此錯誤訊息 ERROR_INSUFFICIENT_BUFFER : ; ERROR_FILE_NOT_FOUND : raise Exception.Create('無預設印表機.'); else raise Exception.Create('GetDefaultPrinter Error, Code : ' IntToStr(GetLastError)); end; end; pPrinterName := nil; try GetMem(pPrinterName, dwBufferSize); GetDefaultPrinter(pPrinterName, dwBufferSize); sPrinterName := StrPas(pPrinterName); // <-- 預設印表機名稱 finally if pPrinterName <> nil then begin FreeMem(pPrinterName, dwBufferSize); pPrinterName := nil; end; end; // 設定印表機的紙張大小名稱 if not WinSpool.OpenPrinter(PChar(sPrinterName), hPrinter, nil) then raise Exception.Create('OpenPrinter Error, Code : ' IntToStr(GetLastError)); WinSpool.GetPrinter(hPrinter, 2, nil, 0, @cbNeeded); _PPrinterInfo2 := nil; try GetMem(_PPrinterInfo2, cbNeeded); WinSpool.GetPrinter(hPrinter, 2, _PPrinterInfo2, cbNeeded, @cbNeeded); with _PPrinterInfo2^.pDevMode^ do begin StrLCopy(dmFormName, PChar(sFormName), CCHFORMNAME - 1); //dmPaperSize := PaperSizeID(sPrinterName, sFormName); dmFields := DM_FORMNAME; // DM_PAPERSIZE end; // 不知為何 SetPrinter 一定會有錯誤 -> GetLastError = ERROR_ACCESS_DENIED // (即使以 Administrator 身份執行), 所以先把 raise 註解掉, Who could explain it for me ? Thanks. if not WinSpool.SetPrinter(hPrinter, 2, _PPrinterInfo2, 0) then ; //raise Exception.Create('SetPrinter Error, Code : ' IntToStr(GetLastError)); finally if _PPrinterInfo2 <> nil then FreeMem(_PPrinterInfo2); _PPrinterInfo2 := nil; end; end; 一般設定紙張大小要在印表機圖示上按 MOUSE 右鍵, 點選列印喜好設定 -> 進階 進入設定視窗設定紙張大小, 上列程式可以以程式設定之(永久設定). 您可以先以手動設定紙張大小為 A3, 在執行程式後查看紙張大小, 喜好設定中的 ~~~Delphi K.Top討論區站長~~ aric
系統時間:2024-04-23 15:31:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!