全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1685
推到 Plurk!
推到 Facebook!

不用win api元件也不預設紙張大小印出qucickrep的內容?

答題得分者是:Justmade
huangeider
高階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-22 23:08:56 IP:61.219.xxx.xxx 未訂閱
小弟有個疑惑很久了以下程式碼(某人的程式碼)一直不會套用在想印的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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-23 01:29:24 IP:61.10.xxx.xxx 未訂閱
試試這個 :    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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-24 23:15:16 IP:210.201.xxx.xxx 未訂閱
引言: 小弟也試過了可預覽 但還得長久研究列印的問題 thx
aric
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-24 23:25:24 IP:218.16.xxx.xxx 未訂閱
試過了列印不成嗎? 我猜也可能不成,因為 QuickRep1.printersetting 裡是沒有設定 width 及 length 的...不知較新的版本可否設定, QUSoft 又未出 Delphi 7 的 QReport3.5 普通版沒得試。 等等看其他高手的高招罷
huangeider
高階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-26 10:15:49 IP:210.201.xxx.xxx 未訂閱
引言: 再請問其它用在delphi的列印軟体(要花COCO的軟体或免費軟体) 有便宜又好用的嗎?
「堅持」從洗馬桶做起 Aric
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-26 10:41:35 IP:218.16.xxx.xxx 未訂閱
過往幾年 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-26 11:01:41 IP:210.201.xxx.xxx 未訂閱
引言: 1這些軟体都可以在程式內指定印出的範圍嗎? (就是指定欲印出的大小width和height而不必 在印表機設定紙張大小) 2那種有支援win98呢? THX
「堅持」從洗馬桶做起 Aric
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-03-26 11:24:10 IP:218.16.xxx.xxx 未訂閱
Report Builder 是可以的,甚至可以每頁不同 (第一頁 A3, 第二頁 A4, 第三頁 Custom 10" X 5" 等等),我沒實作過每頁不同紙張但實作過每頁不同邊界完全可以在 Win2K/98做到。 FastReport 及 Crystal Report 我沒用過不清楚但相信可以做到。 我相信即使 Quick Report 專業版亦可做到這點
huangeider
高階會員


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-03-26 11:31:16 IP:210.201.xxx.xxx 未訂閱
引言: 再請問一個問題 如何得知delphi中quick report的版本 我想知道delphi7.0中的quick report是什麼版的
「堅持」從洗馬桶做起 Aric
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-03-26 11:35:52 IP:218.16.xxx.xxx 未訂閱
放一個 TQuickRpt 到 Form, 右擊, 便可看到, Delphi 內附的應是 3.0.9, 頗舊,但 QuSoft 又沒發表 3.5X for Delphi 7 (for Delphi 5,6 就有),所以 Delphi 7 反而要用舊版的免費 Quick Report
huangeider
高階會員


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-03-26 11:52:14 IP:210.201.xxx.xxx 未訂閱
引言: 感恩 >< face="Verdana, Arial, Helvetica"> 「堅持」從洗馬桶做起 Aric
系統時間:2024-05-07 22:37:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!