要如何在程式中才能把想印的報表印出想印的格式呢? |
缺席
|
huangeider
高階會員 發表:288 回覆:492 積分:231 註冊:2003-02-26 發送簡訊給我 |
小弟最近有個頭痛的問題
若有很多種報表格式欲列印
在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 發送簡訊給我 |
|
huangeider
高階會員 發表:288 回覆:492 積分:231 註冊:2003-02-26 發送簡訊給我 |
引言: 再 QuickRep1.Preview前加上這一就可以自訂你要的紙張大小了 QuickRep1.Page.PaperSize := B5; TRY TRY SEEchih 兄我是在win98下因我用自訂的格式只能自訂一種格式的紙 且不能改名,自訂完紙張大小後紙張的名字還是自訂且就只能自 訂一種格式像我在win 2000下還可自訂像支票列印 大宗郵件等的 格式win 98只能有自訂的格式且不能改名字 所以QuickRep1.Page.PaperSize := B5;這個指令對不能自訂很多紙張 格式的win98來說無法有作用 因此我才想在程式中寫一個能印出 想印報表範圍格式的程式來啊!可能是我表達的不是很清楚 sorry! aric |
cmj
高階會員 發表:15 回覆:242 積分:226 註冊:2002-06-12 發送簡訊給我 |
|
huangeider
高階會員 發表:288 回覆:492 積分:231 註冊:2003-02-26 發送簡訊給我 |
引言: 自定格式如下步驟 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 發送簡訊給我 |
|
huangeider
高階會員 發表:288 回覆:492 積分:231 註冊:2003-02-26 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |