不用win api元件也不預設紙張大小印出qucickrep的內容? |
答題得分者是:Justmade
|
huangeider
高階會員 發表:288 回覆:492 積分:231 註冊:2003-02-26 發送簡訊給我 |
小弟有個疑惑很久了以下程式碼(某人的程式碼)一直不會套用在想印的quickrep上 前題是只想用程式控制印出的範圍 而不要藉用win api元件
(我也不會用) 也不預設紙張大小 而是按一個button後經預覽列印按列印
後就印出想印的紙張範圍如10 height 17width 的紙連續印出來?
(以下程式可印出想印的大小出來) 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
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
試試這個 : Form1 要有綠色的元件及設定好事件,Form2要有一個 Quick Report 叫 QuickRep1 若不想給使用者設定印表機及可在設定時取消列印,可刪藍色的 我試過預覽可以,列印暫不方便試所以不知結果。
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Db, DBTables, Printers, Qrprntr; type TForm1 = class(TForm) PreviewBtn: TButton; edPaperWidth: TEdit; edPaperHeight: TEdit; edFormName: TComboBox; PrintBtn: TButton; procedure PrintBtnClick(Sender : TObject); procedure PreviewBtnClick(Sender : TObject); procedure FormCreate(Sender: TObject); private procedure GoPrint(isPrint : Boolean); { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses Unit2; {$R *.DFM} procedure TForm1.GoPrint(isPrint : Boolean); begin with TForm2.Create(Self) do try QuickRep1.Page.PaperSize := Custom; QuickRep1.Page.Width := StrToInt(edPaperWidth.Text); QuickRep1.Page.Length := StrToInt(edPaperHeight.Text); QuickRep1.PrinterSettings.PaperSize := Custom; QuickRep1.PrinterSettings.PrinterIndex := edFormName.ItemIndex; if isPrint then begin QuickRep1.PrinterSetup; //選 printer, 設定等等 if QuickRep1.Tag = 0 then // 沒按取消 QuickRep1.Print end else QuickRep1.Preview; finally free; end; end; procedure TForm1.PrintBtnClick(Sender : TObject); begin GOPrint(True); // Print, not preview end; procedure TForm1.PreviewBtnClick(Sender : TObject); begin GoPrint(False);// Preview, not print end; procedure TForm1.FormCreate(Sender: TObject); begin edformname.Items := Printer.Printers; edformname.ItemIndex := 0; end; end. |
huangeider
高階會員 發表:288 回覆:492 積分:231 註冊:2003-02-26 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
huangeider
高階會員 發表:288 回覆:492 積分:231 註冊:2003-02-26 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
過往幾年 Report Builder 是非常受 Delphi 使用者歡迎的,連續幾年(1999-2002)都拿了 Delphi 最受歡迎列印工具大獎
http://www.digital-metaphors.com/ 不過近年來 Fast Report 也提升很快了,在這個討論區也好像不少人使用
http://www.fast-report.com/en/index.php 另外最出名的跨語言平台報表工具非 Crystal Report 莫屬,不過價錢可...
http://www.crystaldecisions.com/products/crystalreports/default.asp
而且 crystal report 已公佈不再開發新的 Delphi 元件了 自己試試看那個適合你罷
|
huangeider
高階會員 發表:288 回覆:492 積分:231 註冊:2003-02-26 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
huangeider
高階會員 發表:288 回覆:492 積分:231 註冊:2003-02-26 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
huangeider
高階會員 發表:288 回覆:492 積分:231 註冊:2003-02-26 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |