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

要如何在程式中才能把想印的報表印出想印的格式呢?

缺席
huangeider
高階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-12 21:03:01 IP:210.201.xxx.xxx 未訂閱
小弟最近有個頭痛的問題 若有很多種報表格式欲列印 在win2000中自訂紙張可設很多的格式 但98中好像只有自訂一種格式 在這樣情形下若想在98下印出許多的格式就必須在程式中 設定紙張印出的範圍 印出紙張的範圍是可以 問題是不清楚如何 在程式中把想印的報表印出來 以下是參考別人的程式 要如何才能把想印的報表印出想印的格式呢? unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,WinSpool, Printers, StdCtrls; type TForm1 = class(TForm) Button1: TButton; edPaperWidth: TEdit; edPaperLength: TEdit; edformname: TComboBox; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} (*------------------------------------------------------ Define a new Form (WinNT/2000 only). If FormName already exists, do nothing and return. If failed, an exception will be raised. ------------------------------------------------------*) procedure PrnAddForm(const FormName: string; PaperWidth, PaperLength: integer); var PrintDevice, PrintDriver, PrintPort : array[0..255] of Char; hDMode : THandle; hPrinter: THandle; FormInfo: TFormInfo1; PaperSize: TSize; PaperRect: TRect; errcode: integer; s: string; begin Printer.GetPrinter(PrintDevice, PrintDriver, PrintPort, hDMode); OpenPrinter(PrintDevice, hPrinter, nil); if hPrinter = 0 then raise Exception.Create('Failed to open printer!'); FormInfo.Flags := FORM_USER; FormInfo.pName := PChar(FormName); PaperSize.cx := PaperWidth; PaperSize.cy := PaperLength; PaperRect.Left := 0; PaperRect.Top := 0; PaperRect.Right := PaperWidth; PaperRect.Bottom := PaperLength; FormInfo.Size := PaperSize; FormInfo.ImageableArea := PaperRect; if not AddForm(hPrinter, 1, @FormInfo) then begin errcode := GetLastError; if errcode <> ERROR_FILE_EXISTS then // Form name exists? begin case errcode of ERROR_ACCESS_DENIED: s := 'Access is denied'; ERROR_INVALID_HANDLE: s := 'The handle is invalid'; ERROR_NOT_READY: s := 'The device is not ready'; ERROR_CALL_NOT_IMPLEMENTED: s := 'Function "AddForm" is not supported on this system'; else s := 'Failed to add a Form (paper) name!'; end; raise Exception.Create(s); end; end; ClosePrinter(hPrinter); end; (* Set custom paper size for WinNT/2000. Make sure FormName is supported by current printer, You can call PrnAddForm to define a new Form. *) procedure PrnSetPaperSizeNT(FormName: string; PaperWidth, PaperLength: integer); var Device, Driver, Port: array[0..80] of Char; DevMode: THandle; pDevmode: PDeviceMode; begin // Get printer device name etc. Printer.GetPrinter(Device, Driver, Port, DevMode); // force reload of DEVMODE Printer.SetPrinter(Device, Driver, Port, 0) ; // get DEVMODE handle Printer.GetPrinter(Device, Driver, Port, DevMode); if DevMode <> 0 then begin // lock it to get pointer to DEVMODE record pDevMode := GlobalLock( DevMode ); if pDevmode <> nil then try with pDevmode^ do begin // modify form StrLCopy( dmFormName, PChar(FormName), CCHFORMNAME-1 ); // tell printer driver that dmFormname field contains // data it needs to inspect. dmPaperWidth := PaperWidth; dmPaperLength := PaperLength; dmFields := dmFields or DM_FORMNAME or DM_PAPERWIDTH or DM_PAPERLENGTH; end; finally GlobalUnlock( Devmode ); // unlock devmode handle. end; end; { If } end; procedure TForm1.Button1Click(Sender: TObject); begin PrnAddForm( edformname.text, StrToInt(edPaperWidth.Text), StrToInt(edPaperLength.Text) ); PrnSetPaperSizeNT( edFormName.Text, StrToInt(edPaperWidth.Text), StrToInt(edPaperLength.Text) ); Printer.BeginDoc; Printer.Canvas.TextOut(10, 10, 'Printer test!'); Printer.EndDoc; end; procedure TForm1.FormCreate(Sender: TObject); begin { Show available printers in a Combobox } edformname.Items := Printer.Printers; edformname.ItemIndex := 0; end; end. aric 發表人 - huangeider 於 2003/03/12 21:21:06
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-12 21:31:50 IP:61.216.xxx.xxx 未訂閱
再 QuickRep1.Preview前加上這一就可以自訂你要的紙張大小了 QuickRep1.Page.PaperSize := B5; TRY TRY SEE
huangeider
高階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-12 21:42:33 IP:210.201.xxx.xxx 未訂閱
引言: 再 QuickRep1.Preview前加上這一就可以自訂你要的紙張大小了 QuickRep1.Page.PaperSize := B5; TRY TRY SEE
chih 兄我是在win98下因我用自訂的格式只能自訂一種格式的紙 且不能改名,自訂完紙張大小後紙張的名字還是自訂且就只能自 訂一種格式像我在win 2000下還可自訂像支票列印 大宗郵件等的 格式win 98只能有自訂的格式且不能改名字 所以QuickRep1.Page.PaperSize := B5;這個指令對不能自訂很多紙張 格式的win98來說無法有作用 因此我才想在程式中寫一個能印出 想印報表範圍格式的程式來啊!可能是我表達的不是很清楚 sorry! aric
cmj
高階會員


發表:15
回覆:242
積分:226
註冊:2002-06-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-13 00:33:28 IP:211.76.xxx.xxx 未訂閱
自定格式如下步驟 Report.page.PaperSize:=Custom; //--紙張大小 if PaperLen>0 then Report.page.Length:=PaperLen; if PaperWid>0 then Report.page.Width:=PaperWid; Report.Page.paperSize:=Default; //套表或自定尺寸一定為Default 在WIN2000要印之印表機必為預設印表機印出才會正理
huangeider
高階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-13 00:57:45 IP:61.219.xxx.xxx 未訂閱
引言: 自定格式如下步驟 Report.page.PaperSize:=Custom; //--紙張大小 if PaperLen>0 then Report.page.Length:=PaperLen; if PaperWid>0 then Report.page.Width:=PaperWid; Report.Page.paperSize:=Default; //套表或自定尺寸一定為Default 在WIN2000要印之印表機必為預設印表機印出才會正理
這麼說吧 我不想用win 2000或win98的自訂格式方法 想在程式中設定列印的範圍直接印出quickrep內的報表內容 這樣才不會每次在不同電腦都得必須再設紙張格式 假設有1000台電腦那要run這個列印程式 若都要先設紙張大小也實在是很累的事 所以我想說直接設列印範圍在程式中 直接copy程式後就可使用而不必再設紙張大小 aric
cmj
高階會員


發表:15
回覆:242
積分:226
註冊:2002-06-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-13 11:49:16 IP:211.76.xxx.xxx 未訂閱
簡單講在預覽前要以程式做如下步驟 1.選定印表機,並設為預設印表機. 2.針對此印表機修改其紙張設定,並存入設定. 3.再執行列印. 針對1,2之動作,必須借外部元件來達到或以windows api來做 元件可到http://vcl.vclxx.org/去找 當然前提每一台pc必須安裝印表機且有支援你的紙張格式
huangeider
高階會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-14 16:23:19 IP:210.201.xxx.xxx 未訂閱
引言: 簡單講在預覽前要以程式做如下步驟 1.選定印表機,並設為預設印表機. 2.針對此印表機修改其紙張設定,並存入設定. 3.再執行列印. 針對1,2之動作,必須借外部元件來達到或以windows api來做 元件可到http://vcl.vclxx.org/去找 當然前提每一台pc必須安裝印表機且有支援你的紙張格式
這個東西以我的程度可能要試很久 得等我試出後再回應thx aric
系統時間:2024-04-26 15:24:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!