如何在98下按button要印出三種不同格式的報表? |
缺席
|
huangeider
高階會員 發表:288 回覆:492 積分:231 註冊:2003-02-26 發送簡訊給我 |
小弟在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
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |