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

如何控制紙張小大(PrinterSetupDialog)

尚未結案
littlecheng
一般會員


發表:9
回覆:6
積分:3
註冊:2008-07-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-10-02 14:12:26 IP:59.125.xxx.xxx 訂閱
圖片中是一個PrinterSetupDialog,我想請教:在圖中紅圈所框的地方,
有沒有辦法以程式碼來控制,請參照圖片。


christie
資深會員


發表:30
回覆:299
積分:475
註冊:2005-03-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-10-02 14:52:47 IP:61.59.xxx.xxx 未訂閱
Hi這是以 Delphi 寫的, 可以設定紙張.

Begin
_SetPrintDefault('Letter')
End;
=========================================================
uses WinSpool2;
procedure _SetPrintDefault(_sFormName:string);
var
_PPrinterInfo2 : PPrinterInfo2;
pPrinterName : PChar;
sPrinterName : String;
hPrinter : THandle;
cbNeeded : DWORD;
dwBufferSize : DWORD;

begin
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;
------
What do we live for if not to make life less difficult for each other?
編輯記錄
christie 重新編輯於 2008-10-02 14:57:32, 註解 無‧
系統時間:2024-04-25 20:46:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!