程式自動產生列表機列印紙張設定 |
答題得分者是:chris681016
|
jimmy_wei
高階會員 發表:9 回覆:176 積分:147 註冊:2003-08-28 發送簡訊給我 |
各位大大好:
我想要用程式自動產生一個使用者自定的紙章設定(A4、A5、Letter......等)我要自訂一個非標準的。 有辦法嗎?? 參考過一些站內的文章 http://delphi.ktop.com.tw/board.php?cid=30&fid=71&tid=26727 http://delphi.ktop.com.tw/board.php?cid=30&fid=100&tid=83474 等等等.... 感恩~~ |
chris681016
中階會員 發表:69 回覆:122 積分:98 註冊:2006-10-12 發送簡訊給我 |
我用下列方式變更紙張,不知道對你有沒有用
function VrSet(VR_Size,is_os:string; Print1: TPrinter):string; var Driver,Device,Port: array[0..512] of Char; hDev: THandle; // DeviceMode結構體的記憶體Handle pDev: PDEVICEMODE; // 對DeviceMode結構體的Pointer hPrn: THandle; // 印表機的Handle paper_num,Driver_name:string; hPrinter : THandle; begin Print1.GetPrinter(Device, Driver, Port, hDev); pDev := GlobalLock(hDev); try if (pDev.dmFields and DM_PAPERSIZE) <> 0 then begin pDev.dmPaperSize :=StrToInt(paper_num); //紙張編號,a4的話一定是9,letter一定是1,其它大小可用函數去抓 pDev.dmFields := pdev.dmFields and not (DM_PAPERWIDTH or DM_PAPERLENGTH); end; Win32Check(OpenPrinter(Device, hPrn, Nil)); try // 將印表機設定與預設值合併 Win32Check(DocumentProperties(0, hPrn, Device, pDev^, pDev^, DM_COPY or DM_MODIFY) >= 0); finally ClosePrinter(hPrn); end; finally GlobalUnlock(hDev); end; Print1.SetPrinter(Device, Driver, Port, hDev); end; |
jimmy_wei
高階會員 發表:9 回覆:176 積分:147 註冊:2003-08-28 發送簡訊給我 |
|
chris681016
中階會員 發表:69 回覆:122 積分:98 註冊:2006-10-12 發送簡訊給我 |
Printer.GetPrinter(PrintDevice, PrintDriver, PrintPort, hDMode);
OpenPrinter(PrintDevice, hPrinter, nil); if hPrinter = 0 then raise Exception.Create('找不到印表機!'); with FormInfo do begin Flags := FORM_USER; pName:= PChar(Trim(Edit1.Text)); //紙張名稱 Size.cx := StrToInt(trim(Edit2.Text))*100; //寬 Size.cy := StrToInt(trim(Edit3.Text))*100; //高 ImageableArea.Left := 0; ImageableArea.Top := 0; ImageableArea.Right:=StrToInt(trim(Edit2.Text))*100; ImageableArea.Bottom :=StrToInt(trim(Edit3.Text))*100; end; |
jimmy_wei
高階會員 發表:9 回覆:176 積分:147 註冊:2003-08-28 發送簡訊給我 |
chris您好~~
看起來~~這一段程式確實是設定紙張格式的程式,但有些地方我不明白 Printer.GetPrinter(PrintDevice, PrintDriver, PrintPort, hDMode); OpenPrinter(PrintDevice, hPrinter, nil); 1.printer是不是要先create ==> printer:= Tprinter.create ?? 2.printers這個unit下,確實有getprinter這個 procedure,而WinSpool下也有openprinter, 但我是不要先宣告或給值,還是我只要宣告PrintDevice, PrintDriver, PrintPort, hDMode 就可以,當然PrintDevice, hPrinter也是一樣的情形 with FormInfo do 3.FormInfo是什麼,一個你宣告的元件or是form,我不太明白 4.承上一個問題,以下的屬性,是您自行宣告的嗎??還是那個元件的屬性 Flags := FORM_USER; pName:= PChar(Trim(Edit1.Text)); //紙張名稱 Size.cx := StrToInt(trim(Edit2.Text))*100; //寬 Size.cy := StrToInt(trim(Edit3.Text))*100; //高 ImageableArea.Left := 0; ImageableArea.Top := 0; ImageableArea.Right:=StrToInt(trim(Edit2.Text))*100; ImageableArea.Bottom :=StrToInt(trim(Edit3.Text))*100; 以上 |
chris681016
中階會員 發表:69 回覆:122 積分:98 註冊:2006-10-12 發送簡訊給我 |
給你完整的程式碼,其實我也是看別人的啦,不過忘了參考那的
一般沒有特別指定Printer就會抓預設的那個。 procedure TForm1.Button1Click(Sender: TObject); var PrintDevice, PrintDriver, PrintPort : array[0..255] of Char; hDMode : THandle; hPrinter : THandle; FormInfo : TFormInfo1; begin Printer.GetPrinter(PrintDevice, PrintDriver, PrintPort, hDMode); OpenPrinter(PrintDevice, hPrinter, nil); if hPrinter = 0 then raise Exception.Create('找不到印表機!'); with FormInfo do begin Flags := FORM_USER; pName:= PChar(Trim(Edit1.Text)); Size.cx := StrToInt(trim(Edit2.Text))*100; Size.cy := StrToInt(trim(Edit3.Text))*100; ImageableArea.Left := 0; ImageableArea.Top := 0; ImageableArea.Right:=StrToInt(trim(Edit2.Text))*100; ImageableArea.Bottom :=StrToInt(trim(Edit3.Text))*100; end; //檢查新增紙張是否重覆 if not SetForm(hPrinter, PChar(Trim(Edit1.Text)), 1, @FormInfo) then begin AddForm(hPrinter, 1, @FormInfo); ShowMessage('Success'); end else ShowMessage('Repeat Page_Nme'); ClosePrinter(hPrinter); end; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |