亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

Delphi程序執(zhí)行時實時生成報表

2019-11-18 18:55:01
字體:
供稿:網(wǎng)友

當(dāng)前,在軟件開發(fā)工具中,Delphi以其控件多、面向?qū)ο缶幊坦δ軓?、代碼執(zhí)行速度快和簡單易用等特點,結(jié)合可視化開發(fā)環(huán)境和當(dāng)前最快的編譯器技術(shù),已成為全球公認(rèn)的快速應(yīng)用開發(fā)工具,正被愈來愈多的編程人員所采用。使用Delphi可以編寫各種Windows應(yīng)用程序,尤其是開發(fā)數(shù)據(jù)庫信息管理系統(tǒng)有其獨特的優(yōu)勢。在數(shù)據(jù)庫信息管理系統(tǒng)的開發(fā)的過程中,我們經(jīng)常需要打印輸出很多報表,用Delphi設(shè)計復(fù)雜報表是一件比較煩鎖的事件,它沒有Visual FoxPRo中那樣簡便。但由于Delphi中設(shè)計報表采用的也是控件,因此,我們可以在程序執(zhí)行時直接建立所需的報表控件來實時生成報表,而且,生成的報表樣工可以由程序控制來決定。例如,我們在數(shù)據(jù)庫信息查詢時,查詢出來的結(jié)果信息結(jié)構(gòu)一般是不固定的,假如我們要將查詢結(jié)果打印出來,只設(shè)計一種報表格式是不行的,為所有可能的結(jié)果信息都設(shè)計一種報表格式也不是一種很好的解決辦法。為了解決這樣一個問題,我們可以采用實時生成報表技術(shù)。本文的目的就是通過一個實例向大家詳細(xì)介紹怎樣實時生成報表。
    本例所將設(shè)計一個打印對話框,該對話框包括TQickRep控件和一些報表樣式控制控件,其它窗體外觀如下圖所示:
1、 控件功能說明
QuickRep:TQuickRep  它包括列標(biāo)頭(HB:TQRBand)、細(xì)節(jié)(DB:TQRBand)、頁腳(FB:TQRBand)、總結(jié)(SB:TQRBand)帶區(qū),并且細(xì)節(jié)、頁腳、總結(jié)中沒有包括一個TQRLabel、TQRExpr或TDBText控件,主要是在程序執(zhí)行時建立,列標(biāo)頭帶區(qū)中包括Title(TQRLabel)用于報表標(biāo)題;QRSQL: TQRLabel用于查詢條件,這兩個控件的Caption屬性在程序執(zhí)行時可任意更改。為了能夠讓QuickRep不顯示出來,將其置于Panel1(Tpanel)的后面,并將Panel1擴展到整個窗體;
Query:TQuery  SQL語句控件,程序?qū)⒏鶕?jù)Query返回的結(jié)果來生成報表。因此,在建立這個窗體時,一定要將Query.SQL屬性指定一條SQL語句;
在以上窗體中“紙張”和“頁面設(shè)置”兩欄所包括的控件是對QuickRep.Page屬性的控制,程序執(zhí)行時更改它們會直接改變QuickRep控件相應(yīng)的屬性值,這可以通過OnChange或OnExit事件代碼完成;
“打印內(nèi)容設(shè)置”欄中的標(biāo)題是指定報表的標(biāo)題(TT:TEdit),其值與QuickRep.ReportTitle和Title.Caption一致,可以任意更改;“打印查詢條件”復(fù)選框指定是否打印查詢條件,該復(fù)選框的選取否直接控制QRSQL.Caption是否為空;“表列對齊方式”由一組選項按鈕組成,它主要用于報表生成時細(xì)節(jié)內(nèi)容的對齊方式,它的更改控制變量RD1(Byte)的值(0自動對齊,1中間對齊,2左邊對齊);“表列打印寬度”由一組選項按鈕組成,主要用于在生成報表格式時列值的寬度,它的更改控制變量RD2(Byte)的值(0自動寬度,1相同寬度,2限制最大寬度),當(dāng)選中1相同寬度,2限制最大寬度時要求輸入寬度,單位為像素;“統(tǒng)計方式”指出報表是否包含頁腳(FB:TQRBAND)和總和(SB:TQRBAND)帶區(qū)。
2、 程序說明
程序定義了如下類型:
      TQRLabelName=array of TQRLabel;
      TQRDBTextName=array of TQRDBText;
      TQRShapeName=array of TQRShape;
      TQRExpName=array of TQRExpr;
上述類型為動態(tài)數(shù)組類型,數(shù)據(jù)的每個元素為一個類。在實時建立報表控件時,要建立的控件個數(shù)是不確定的且控制名稱也不能確定,用動態(tài)數(shù)組是一個比較好的解決辦法,即可以任意指定數(shù)據(jù)的維數(shù),又不用自己管理內(nèi)存分配問題,還有利于報表包含控件的釋放與處理。程序還聲明了上述類型的變量如下:
      CHBName:TQRLabelName;
      DBName:TQRDBTextName;
      CHBShape,DBShape,FBShape,SumShape:TQRShapeName;
      FBName,SumName:TQRExpName;
這些數(shù)組變量將在窗體建立時根據(jù)Query返回的字段結(jié)果分配內(nèi)存,每一個字段對就數(shù)組的一個元素。
程序執(zhí)行過程:窗體在建立并顯示時,就對本窗體建立初始化操作。在OnCreate事件中將QuickRep.Page屬性的相應(yīng)值顯示出來,在OnShow事件中執(zhí)行Query.Open操作,并根據(jù)返回結(jié)果分配控件數(shù)組變量空間。窗體建立后,單擊“生成”按鈕生成報表(忽略備注字段和相片字段),然后可單擊“打印”和“預(yù)覽”進(jìn)行打印或者預(yù)覽報表。當(dāng)產(chǎn)生報表后又更改了設(shè)置,必須重新生成報表。如果Query返回的結(jié)果集字段太多,生成報表時有可能紙張礦小不能將生成全部報表,可調(diào)整報表紙張大小,再生成報表。當(dāng)關(guān)閉窗體時,將釋放建立的控件。
3、 源程序清單及注釋
unit PrintDlg;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, ExtCtrls, Spin, QuickRpt,QRPrntr,printers, Qrctrls,
  Db, DBTables, ComCtrls,SysIni;
type
  TQRLabelName=array of TQRLabel;//列標(biāo)頭帶區(qū)中列標(biāo)題控制件類動態(tài)數(shù)組
  TQRDBTextName=array of TQRDBText; //細(xì)節(jié)帶區(qū)中列標(biāo)題控制件類動態(tài)數(shù)組
  TQRShapeName=array of TQRShape; //線條控制件類動態(tài)數(shù)組
  TQRExpName=array of TQRExpr; //統(tǒng)計控制件類動態(tài)數(shù)組
  TPrintForm = class(TForm)
    GroupBox1: TGroupBox;
    Label5: TLabel;
    BtnSet: TbitBtn;//“設(shè)置”按鈕控件
    BtnCancel: TBitBtn;// “關(guān)閉”按鈕控件
    Panel1: TPanel;
    BtnPrint: TBitBtn;// “打印”按鈕控件
    BtnPrview: TBitBtn;// “預(yù)覽”按控件鈕
    QuickRep: TQuickRep;// 快速報表控件
    HB: TQRBand;// “列標(biāo)頭”帶區(qū)控件
    Title: TQRLabel;// 報表標(biāo)題控件
    QRE1: TQRExpr;// 列標(biāo)頭帶區(qū)中“頁碼”控件
    QRE2: TQRExpr;//列標(biāo)頭帶區(qū)中“日期”控件
    Panel2: TPanel;
    Label1: TLabel;
    R1: TRadioButton;//“ 縱向打印”控件
    R2: TRadioButton;// “橫向打印”控件
    GroupBox4: TGroupBox;
    TT: TEdit;// 標(biāo)題輸入框控件
    Label2: TLabel;
    SR: TCheckBox;// “打印查詢條件”控件
    Label3: TLabel;
    Image1: TImage;//顯示縱向打印圖像
    Image2: TImage;//顯示橫向打印圖像
    QRSQL: TQRLabel;// 列標(biāo)頭帶區(qū)中用于顯示“查詢條件”控件
    GroupBox2: TGroupBox;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    PageSpace: TEdit;// 欄間距輸入框控件
    PageTop: TEdit;// 頁邊距上輸入框控件
    PageBottom: TEdit; // 頁邊距下輸入框控件
    PageLeft: TEdit; // 頁邊距左輸入框控件
    PageRight: TEdit; // 頁邊距右輸入框控件
    PageDlux: TCheckBox; // “雙面打印”控件
    PageCol: TEdit; // 分欄輸入框控件
    Pages: TEdit; // 打印份數(shù)輸入框控件
    PaperH: TEdit; // 紙張長度輸入框控件
    PaperW: TEdit;//紙張寬度輸入框控件
    Label4: TLabel;
    Label6: TLabel;
    Ps: TComboBox;//紙張型號列表框控件
    Query: TQuery;//SQL查詢控件
    DB: TQRBand;// “細(xì)節(jié)”帶區(qū)控件
    CrtRep: TBitBtn; // “生成”按鈕控件
    Label14: TLabel;
    Label15: TLabel;
    Panel3: TPanel;
    Wdauto: TRadioButton; // “自動寬度”控件
    Wdall: TRadioButton; // “相同寬度”控件
    Wdmax: TRadioButton; // “限制最在寬度”控件
    Label16: TLabel;
    ColWd: TEdit; // 列寬輸入框控件
    Panel4: TPanel;
    DJAUTO: TRadioButton; // “自動對齊”控件
    DJCENTER: TRadioButton; // “中間中齊”控件
    DJLEFT: TRadioButton; // “左邊對齊”控件
    FB: TQRBand; // 頁腳帶區(qū)控件
    Label17: TLabel;
    Panel5: TPanel;
    TJ1: TCheckBox; // “每頁統(tǒng)計”控件
    TJ2: TCheckBox; // “統(tǒng)計總和”控件
    SB: TQRBand; // 總和帶區(qū)控件
    procedure FormCreate(Sender: TObject);
    procedure RadioButtonClick(Sender: TObject);
    procedure PageDluxClick(Sender: TObject);
    procedure PageColChange(Sender: TObject);
    procedure PageSpaceExit(Sender: TObject);
    procedure PagesChange(Sender: TObject);
    procedure PageTopExit(Sender: TObject);
    procedure PageBottomExit(Sender: TObject);
    procedure PageLeftExit(Sender: TObject);
    procedure PageRightExit(Sender: TObject);
    procedure TTExit(Sender: TObject);
    procedure DTClick(Sender: TObject);
    procedure BtnPrviewClick(Sender: TObject);
    procedure BtnSetClick(Sender: TObject);
    procedure PsChange(Sender: TObject);
    procedure PaperChange(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDestroy(Sender: TObject);
    procedure CreateReport(Sender: TObject);
    procedure SRClick(Sender: TObject);
    procedure ClearRep();
    procedure FormShow(Sender: TObject);
    procedure PaperSizeChg(Sender: TObject);
    procedure DJChage(Sender: TObject);
    procedure WdChage(Sender: TObject);
    procedure QuickRepStartPage(Sender: TCustomQuickRep);
    procedure BtnPrintClick(Sender: TObject);
  private
    { Private declarations }
    CHBName:TQRLabelName;//定義列標(biāo)頭帶區(qū)控件名動態(tài)數(shù)組名
    DBName:TQRDBTextName; //定義細(xì)節(jié)帶區(qū)控件名動態(tài)數(shù)組名
    CHBShape,DBShape,FBShape,SumShape:TQRShapeName; //定義線條控件動態(tài)數(shù)組名
    FBName,SumName:TQRExpName; //定義頁腳(FBNAME)和總和帶區(qū)(SUMNAME)控件名動態(tài)數(shù)組名
    DJ:TAlignment;//列對齊方式(taLeftJustify, taRightJustify, taCenter)
    Rd1,Rd2:Byte;//用于保存表列對齊方式(RD1)和打印寬度(RD2)狀態(tài)變量名
  public
   { Public declarations }
CXTJ,BT:String;//CXTJ存放查詢條件,BT存放報表標(biāo)題
               //由上一級窗體指定
  end;

const
  PaperSize:array[0..26] of TQRPaperSize=(A3, A4, A4Small, A5, B4, B5, Letter,
                LetterSmall, Tabloid, Ledger, Legal,Statement, Executive, Folio,
                Quarto, qr10X14, qr11X17, Note, Env9, Env10, Env11, Env12,
                Env14, CSheet, DSheet, ESheet, Custom);
//QuickRep所列出的紙張類型

var
  PrintForm: TPrintForm;

implementation

{$R *.DFM}

procedure TPrintForm.FormCreate(Sender: TObject);
//將QuickRep.Page屬性以及其它屬性值顯示出來
var
  I:Byte;
begin
  PageCol.Text:=IntToStr(QuickRep.Page.Columns);
  PageSpace.Text:=FormatFloat('0.00',QuickRep.Page.ColumnSpace);
  PageTop.Text:=FormatFloat('0.00',QuickRep.Page.TopMargin);
  PageBottom.Text:=FormatFloat('0.00',QuickRep.Page.BottomMargin);
  PageLeft.Text:=FormatFloat('0.00',QuickRep.Page.LeftMargin);
  PageRight.Text:=FormatFloat('0.00',QuickRep.Page.RightMargin);
  PageSpace.Text:=FormatFloat('0.00',QuickRep.page.ColumnSpace);
  R1.Checked:=QuickRep.Page.Orientation=poPortrait;
  Image1.Visible:=R1.Checked;
  R2.Checked:=QuickRep.Page.Orientation=poLandscape;
  Image2.Visible:=R2.Checked;
  PageDlux.Checked:=QuickRep.PrinterSettings.Duplex;
  Pages.Text:=IntToStr(QuickRep.PrinterSettings.Copies);
  PaperH.Text:=FormatFloat('0.00',QuickRep.Page.Length);
  PaperW.Text:=FormatFloat('0.00',QuickRep.Page.Width);
  For I:=0 to 26 do     //PS列表框顯示紙張類型
    if QuickRep.Page.PaperSize=PaperSize[I] then begin
       PS.ItemIndex:=I;
       Break;
end;
//判斷紙張寬度是否可以更改,只有紙張類型為自定義(Ps.ItemIndex=26)才能更改
  PaperH.Enabled:=Ps.ItemIndex=26;
  PaperW.Enabled:=Ps.ItemIndex=26;
end;

procedure TPrintForm.RadioButtonClick(Sender: TObject);
//紙張方向改變事件處理
var
  S:String;
begin
  Image1.Visible:=R1.Checked;
  Image2.Visible:=R2.Checked;
  if R1.Checked then
    QuickRep.Page.Orientation:=poPortrait
  else
    QuickRep.Page.Orientation:=poLandscape;
  //交換紙張寬度和長度的值
  S:=PaperH.Text;
  PaperH.Text:=PaperW.Text;
  PaperW.Text:=S;
  if (Ps.ItemIndex=26) or (Ps.ItemIndex=0) then begin
    QuickRep.Page.Width:=StrToFloat(PaperW.Text);
    QuickRep.Page.Length:=StrToFloat(PaperH.Text);
  end;
end;

procedure TPrintForm.PageDluxClick(Sender: TObject);
begin
  QuickRep.PrinterSettings.Duplex:=PageDlux.Checked;
end;

procedure TPrintForm.PageColChange(Sender: TObject);
begin
  if StrToInt(PageCol.Text)<1 then PageCol.Text:='1';
  QuickRep.Page.Columns:=StrToInt(PageCol.Text);
end;

procedure TPrintForm.PageSpaceExit(Sender: TObject);
begin
  QuickRep.Page.ColumnSpace:=StrToFloat(PageSpace.Text);
end;

procedure TPrintForm.PagesChange(Sender: TObject);
begin
  if StrToInt(Pages.Text)<1 then Pages.Text:='1';
  QuickRep.PrinterSettings.Copies:=StrToInt(Pages.Text);
end;

procedure TPrintForm.PageTopExit(Sender: TObject);
begin
  QuickRep.Page.TopMargin:=StrToFloat(PageTop.Text);
end;

procedure TPrintForm.PageBottomExit(Sender: TObject);
begin
  QuickRep.Page.BottomMargin:=StrToFloat(PageBottom.Text);
end;

procedure TPrintForm.PageLeftExit(Sender: TObject);
begin
  QuickRep.Page.LeftMargin:=StrToFloat(PageLeft.Text);
end;

procedure TPrintForm.PageRightExit(Sender: TObject);
begin
  QuickRep.Page.RightMargin:=StrToFloat(PageRight.Text);
end;

procedure TPrintForm.TTExit(Sender: TObject);//標(biāo)題更改事件處理
begin
  QuickRep.ReportTitle:=TT.Text;
  Title.Caption:=TT.Text;
  Bt:=TT.Text;
end;

procedure TPrintForm.DTClick(Sender: TObject);//打印查詢條件復(fù)選框事件
begin
  QRSQL.Enabled:=SR.Checked;
end;

procedure TPrintForm.BtnPrviewClick(Sender: TObject);//預(yù)覽按鈕單擊事件
begin
  QuickRep.Preview;
end;

procedure TPrintForm.BtnSetClick(Sender: TObject); //設(shè)置按鈕單擊事件
begin
  QuickRep.PrinterSetup;
end;

procedure TPrintForm.PsChange(Sender: TObject);//紙張類型改變事件
begin
  QuickREp.Page.PaperSize:=PaperSize[Ps.ItemIndex];
  PaperH.Text:=FormatFloat('0.00',QuickRep.Page.Length);
  PaperW.Text:=FormatFloat('0.00',QuickRep.Page.Width);
  PaperH.Enabled:=Ps.ItemIndex=26;
  PaperW.Enabled:=Ps.ItemIndex=26;
  CrtRep.Enabled:=True;
  BtnPrint.Enabled:=not CrtRep.Enabled;
  BtnPrview.Enabled:=BtnPrint.Enabled;
end;

procedure TPrintForm.PaperChange(Sender: TObject);//紙張寬度和長度改變事件
begin
  QuickRep.Page.Width:=StrToFloat(PaperW.Text);
  QuickRep.Page.Length:=StrToFloat(PaperH.Text);
end;

procedure TPrintForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action:=caFree;
end;

procedure TPrintForm.FormDestroy(Sender: TObject);
begin
  ClearRep;
  PrintForm:=nil;
end;

procedure TPrintForm.CreateReport(Sender: TObject);//生成按鈕單擊事件
Var
  I,L:Byte;
  CHBtp,CHBlf,Cd,ObWidth:Word;
begin
  Screen.Cursor:=crHourGlass;
  Title.Caption:=Bt;//設(shè)置標(biāo)題
  ClearRep(); //清除已經(jīng)建立的對象;
  if Sr.Checked then QrSQL.Caption:=CXTJ else QRSQL.Caption:=';//是否打印查詢條件?
  CHBtp:=HB.Height-17;//建立的控件在帶區(qū)中的頂部位置
  CHBlf:=0; //建立的控件在帶區(qū)中的左邊位置
  ObWidth:=0; //建立的控件的寬度
  for I := 0 to Query.FieldCount-1 do    //根據(jù)Query返回字段數(shù)建立控件
  begin
if (Query.Fields[I].DataType<>ftBlob) And (Query.Fields[I].DataType<>ftMemo) then    
begin    //忽略備注字段和相片字段
      L:=Query.Fields[I].DataSize-1;//L=字段寬度(字節(jié))-1
      case Rd1 of   //根據(jù)選擇的對齊方式設(shè)置控件的對齊方式
        0: if L<=10 then Dj:=taCenter else DJ:=taLeftJustify;
        //自動對齊:字段小于等于10居中對齊,否則左邊對齊
        1: Dj:=taCenter;//居中對齊
        2: DJ:=taLeftJustify;//左邊對齊
      end;
      case Rd2 of    //根據(jù)選擇的列表寬度設(shè)置報表列寬度
        0: begin    
       //自動寬度:如果L>14則寬度ObWidth=14+(L-14)/2;如果ObWidth
       //的寬度不能顯示列標(biāo)題,則ObWidth=列標(biāo)題寬度;如果字段類型
       //為日期型、貨幣型和浮點數(shù)型,則ObWidth=65
             if L>14 then L:=14+(L-14) div 2;
             ObWidth:=L*6;
             L:=Length(Query.Fields[I].DisplayName);
             if ObWidth<L*6 then ObWidth:=L*6;
             ObWidth:=ObWidth+2;
             if (Query.Fields[I].DataType=ftDateTime) or
                (Query.Fields[I].DataType=ftFloat) or
                (Query.Fields[I].DataType=ftCurrency) then ObWidth:=65;
           end;
        1: if ColWd.Text<>' then ObWidth:=StrToInt(ColWd.Text)
              else ObWidth:=100;//相同寬度:ObWidth=輸入寬度值
        2: begin  //限制最大寬度:首先按自動寬度計算再判斷寬度是否超最大值,
                  //如果超過則ObWidth=最大寬度輸入值
             if ColWd.Text<>' then Cd:=StrToInt(ColWd.Text)
                else Cd:=200;
             ObWidth:=L*6;
             if ObWidth>Cd then ObWidth:=Cd;
             ObWidth:=ObWidth+2;
             if (Query.Fields[I].DataType=ftDateTime) or
                (Query.Fields[I].DataType=ftFloat) or
                (Query.Fields[I].DataType=ftCurrency) then ObWidth:=65;
           end;
      end;

      if CHBlf+ObWidth>=HB.Width then begin  //建立控件>紙寬?
        DlgMes:='紙張寬度不夠,請更改紙張尺寸。';
        MessageBox(Handle,DlgMes,Cap_Inf,Ico_Inf);
        break;
      end
      else begin
        CHBShape[I]:=TQRShape.Create(HB);//建立列標(biāo)頭帶區(qū)線條控件
        CHBShape[I].Parent:=HB;
        CHBShape[I].Top:=CHBtp;
        CHBShape[I].Left:=CHBlf;
        CHBShape[I].Width:=ObWidth+1;
        CHBShape[I].Height:=17;

        CHBNAME[I]:=TQRLabel.Create(HB); //建立列標(biāo)題控件
        CHBNAME[I].Parent:=HB;
        CHBNAME[I].Top:=CHBtp+2;
        CHBNAME[I].Left:=CHBlf+1;
        CHBNAME[I].AutoSize:=False;
        CHBNAME[I].Width:=ObWidth-1;
        CHBNAME[I].Alignment:=taCenter;
        CHBNAME[I].Caption:=Query.Fields[I].DisplayName;//取字段作為列名
        CHBNAME[I].BringToFront;

        DBShape[I]:=TQRShape.Create(DB); //建立細(xì)節(jié)帶區(qū)線條控件
        DBShape[I].Parent:=DB;
        DBShape[I].Top:=-1;
        DBShape[I].Left:=CHBlf;
        DBShape[I].Width:=ObWidth+1;
        DBShape[I].Height:=17;

        DBNAME[I]:=TQRDBText.Create(DB); //建立細(xì)節(jié)帶區(qū)控件
        DBNAME[I].Parent:=DB;
        DBNAME[I].ParentReport:=QuickRep;
        DBNAME[I].Top:=2;
        DBNAME[I].Left:=CHBlf+2;
        DBNAME[I].AutoSize:=False;
        DBNAME[I].Width:=ObWidth-3;
        DBNAME[I].Height:=13;
        DBNAME[I].Alignment:=Dj;
        DBNAME[I].DataSet:=Query;
        DBNAME[I].DataField:=Query.Fields[I].FieldName;
        DBNAME[I].BringToFront;

        if Tj1.Checked then begin  //是否建立頁腳帶區(qū)?
          FBShape[I]:=TQRShape.Create(FB); //建立頁腳帶區(qū)線條控件
          FBShape[I].Parent:=FB;
          FBShape[I].Top:=0;
          FBShape[I].Left:=CHBlf;
          FBShape[I].Width:=ObWidth+1;
          FBShape[I].Height:=17;

          if (Query.Fields[I].DataType=ftFloat) or
             (Query.Fields[I].DataType=ftCurrency) or (I<2) then
          begin //如果字段類型為數(shù)值類型則建立
            FBNAME[I]:=TQRExpr.Create(FB); //建立頁腳帶區(qū)控件
            FBNAME[I].Parent:=FB;
            FBNAME[I].ParentReport:=QuickRep;
            FBNAME[I].Top:=3;
            FBNAME[I].Left:=CHBlf+2;
            FBNAME[I].AutoSize:=False;
            FBNAME[I].Width:=ObWidth-3;
            FBNAME[I].Height:=13;
            FBNAME[I].Alignment:=taCenter;
            FBNAME[I].Expression:='SUM(QUERY.'+Query.Fields[I].FieldName+')';
            FBNAME[I].BringToFront;
          end;
        end;

        if Tj2.Checked then begin  //是否建立總和帶區(qū)?
          SumShape[I]:=TQRShape.Create(SB); //建立總和帶區(qū)線條控件
          SumShape[I].Parent:=SB;
          SumShape[I].Top:=0;
          SumShape[I].Left:=CHBlf;
          SumShape[I].Width:=ObWidth+1;
          SumShape[I].Height:=17;

          if (Query.Fields[I].DataType=ftFloat) or
             (Query.Fields[I].DataType=ftCurrency) or (I<2) then
          begin   //如果字段類型為數(shù)值類型則建立
            SumNAME[I]:=TQRExpr.Create(SB);  //建立總和帶區(qū)控件
            SumNAME[I].Parent:=SB;
            SumNAME[I].ParentReport:=QuickRep;
            SumNAME[I].Top:=3;
            SumNAME[I].Left:=CHBlf+2;
            SumNAME[I].AutoSize:=False;
            SumNAME[I].Width:=ObWidth-3;
            SumNAME[I].Height:=13;
            SumNAME[I].Alignment:=taCenter;
            SumNAME[I].Expression:='SUM(QUERY.'+Query.Fields[I].FieldName+')';
            SumNAME[I].BringToFront;
          end;
        end;
        CHBlf:=CHBlf+ObWidth;//當(dāng)前字段處理完成,往右一個字段寬度
      end;
    end;
  end;
  CrtRep.Enabled:=False;//禁上生成按鈕
  BtnPrint.Enabled:=not CrtRep.Enabled;允許打印銨鈕
  BtnPrview.Enabled:=BtnPrint.Enabled;允許預(yù)覽按鈕
  if Tj1.Checked then begin  //如果建立了頁腳帶區(qū),則將頁腳帶區(qū)中前兩列更改
    FBNAME[0].Expression:=''頁合計'';
    FBNAME[1].Expression:='COUNT+'行'';
  end;
  if Tj1.Checked then begin  //如果建立了總和帶區(qū),則將總和帶區(qū)中前兩列更改
    SumNAME[0].Expression:=''總計'';
    SumNAME[1].Expression:='COUNT+'行'';
  end;
  //調(diào)整列標(biāo)頭帶區(qū)中的日期及頁碼打印位置
  QRE2.Left:=HB.Width-Qre2.Width;
  QRSQL.Left:=QRE1.Width+10;
  QRSQL.Width:= QRE2.Left-10-QRSQL.Left;
  QuickRep.DataSet:=Query;  //為QuickRep指定數(shù)據(jù)集,該句一定不能少
  Screen.Cursor:=crDefault;
end;

procedure TPrintForm.ClearRep();//清除生成報表格式時建立的控件
Var
  I:Byte;
begin
  For I:=0 to Query.FieldCount-1 do  begin
    if Assigned(CHBShape[I]) then begin CHBShape[I].Free;CHBShape[I]:=nil;end;
    if Assigned(CHBNAME[I]) then begin CHBNAME[I].Free;CHBNAME[I]:=nil;end;
    if Assigned(DBShape[I]) then begin DBShape[I].Free;DBShape[I]:=nil;end;
    if Assigned(DBNAME[I]) then begin DBNAME[I].Free;DBNAME[I]:=nil;end;
    if Assigned(FBShape[I]) then begin FBShape[I].Free;FBShape[I]:=nil;end;
    if Assigned(FBNAME[I]) then begin FBNAME[I].Free;FBNAME[I]:=nil;end;
    if Assigned(SumShape[I]) then begin SumShape[I].Free;SumShape[I]:=nil;end;
    if Assigned(SumNAME[I]) then begin SumNAME[I].Free;SumNAME[I]:=nil;end;
  end;
end;

procedure TPrintForm.SRClick(Sender: TObject);
begin
  if Sr.Checked then QrSQL.Caption:=CXTJ else QRSQL.Caption:=';
end;

procedure TPrintForm.FormShow(Sender: TObject);  //窗體顯示事件
begin
  Query.Active:=True;//打印SQL
  TT.Text:=Bt;
  QuickRep.ReportTitle:=Bt;//設(shè)置標(biāo)題
  //控件名數(shù)組分配空間
  SetLength(CHBNAME,Query.FieldCount);
  SetLength(CHBShape,Query.FieldCount);
  SetLength(DBNAME,Query.FieldCount);
  SetLength(DBShape,Query.FieldCount);
  SetLength(FBNAME,Query.FieldCount);
  SetLength(FBShape,Query.FieldCount);
  SetLength(SumNAME,Query.FieldCount);
  SetLength(SumShape,Query.FieldCount);
end;

procedure TPrintForm.PaperSizeChg(Sender: TObject);
begin
  CrtRep.Enabled:=True;
  BtnPrint.Enabled:=not CrtRep.Enabled;
  BtnPrview.Enabled:=BtnPrint.Enabled;
end;

procedure TPrintForm.DJChage(Sender: TObject);//對齊方式改變事件處理
var
  Chg:Byte;
begin
  if Djauto.Checked then Chg:=0
    else if DjCenter.Checked then Chg:=1
      else Chg:=2;
  if Chg<>Rd1 then begin PaperSizeChg(nil);Rd1:=Chg;end;
end;

procedure TPrintForm.WdChage(Sender: TObject);//寬度改變事件處理
var
  Chg:Byte;
begin
  if Wdauto.Checked then Chg:=0
    else if Wdall.Checked then begin
                                 Chg:=1;
                                 if ColWd.Text=' then ColWd.Text:='100';
                               end
      else begin
         Chg:=2;
         if ColWd.Text=' then ColWd.Text:='200';
      end;
  if Chg<>Rd2 then begin PaperSizeChg(nil);Rd2:=Chg;end;
  ColWd.Enabled:=Chg<>0;
end;

procedure TPrintForm.QuickRepStartPage(Sender: TCustomQuickRep);
//報表打印開始新頁事件處理,頁腳帶區(qū)中的統(tǒng)計值清空
Var
  I:Byte;
begin
if Tj1.Checked then
  For I:=0 to Query.FieldCount-1 do
    if Assigned(FBNAME[I]) then FBNAME[I].Reset;
end;

procedure TPrintForm.BtnPrintClick(Sender: TObject);
begin
  QuickRep.Print;
end;
end.
4、 調(diào)用對話框舉例:
首先在將要調(diào)用的窗體中的USES語句中包含PrintDlg單元,然后可以用如下代碼調(diào)用:
if not assigned(PrintForm) then PrintForm:=TPrintForm.Create(application);
PrintForm.Query.SQL.Assign(Query.SQL);
//如果調(diào)用窗體不包含Query控件,可直接設(shè)置SQL語句的值
PrintForm.Bt:=報表標(biāo)題;
PrintForm.Caption:=窗體標(biāo)題;
PrintForm.CXTJ:=查詢條件;
PrintForm.ShowModal;
5、 結(jié)束語
此程序關(guān)鍵是CreateReport事件過程和動態(tài)控件名稱的處理。由于編幅所限,有些內(nèi)容沒有說明,希望讀者自行體會。對于一般的報表生成,此程序能夠滿足要求。

本人有最新版本,功能更強,有需要的朋友可發(fā)郵件給我,一定郵的。


上一篇:Delphi中串行通信的實現(xiàn)

下一篇:Delphi的壓縮流與解壓流

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網(wǎng)友關(guān)注

偷拍亚洲精品| 欧美三级中文字幕在线观看| 国产成人精品综合久久久久99| 青青草伊人久久| 久久艹国产精品| 久久一级大片| 激情高潮到大叫狂喷水| 女同性一区二区三区人了人一| 国产精品久久久对白| 亚洲午夜精品一区 二区 三区| 国产精品vvv| 欧美黄色片在线观看| 一区二区视频在线播放| 一区二区在线视频| 国产一级一片免费播放| 日韩欧国产精品一区综合无码| 尤物tv国产一区| 可以免费看的黄色网址| 一本色道久久综合狠狠躁篇怎么玩| 国产精品久久久免费观看| 国产乱码精品一区二区三区五月婷| 在线免费福利| 香蕉精品视频在线观看| 亚洲欧美天堂网| 亚洲成人激情在线观看| 日韩免费毛片视频| 欧美成人一区二区三区高清| 一区二区三区四区在线免费视频| 神马久久久久久久久久久| 99精品国产一区二区| 97se视频在线观看| 男女羞羞网站| 精品国产一区二区三区| 岛国精品视频在线播放| 色偷偷亚洲女人天堂观看欧| 欧美精品一区二区三区视频| 91av视频在线播放| 中文字幕 日本| 裸体免费网站| 免费一级欧美片在线观看网站| 人妻熟人中文字幕一区二区| 无码人妻精品一区二区三区温州| 中文字幕在线观看一区二区三区| 国产精品一区二区av影院萌芽| 99在线欧洲视频| 国产色综合网| 揉丰满老妇老女人的毛片| 七七久久电影网| 日韩电影大片中文字幕| 亚洲国产激情av| 久久精品视频中文字幕| 精品国产欧美成人夜夜嗨| 激情影院在线观看| 三上悠亚影音先锋| 少妇高潮久久77777| 成年人网站在线观看免费| 午夜视频在线观看一区二区| 欧美国产亚洲另类动漫| 宅男深夜免费观看视频| 久久亚洲欧美国产精品乐播| 91禁男男在线观看| 国产在线精品一区免费香蕉| 粗暴蹂躏中文一区二区三区| 国产真实伦在线观看| 欧美伦理视频网站| 欧美一级免费在线| 簧片在线免费看| 亚洲一级片在线看| 少妇无套内谢久久久久| 亚洲欧美日韩国产综合在线| 色婷婷av一区二区三区gif| 超级碰碰久久| 91影院在线观看| 亚洲精品免费一区亚洲精品免费精品一区| 男男成人高潮片免费网站| 国产又粗又大又爽视频| 国产又色又爽又黄刺激在线视频| 免费黄色在线视频网站| 青椒成人免费视频| 日韩av自拍偷拍| www.日本xxxx| 国内自拍偷拍视频| www.性欧美| 日韩极品在线观看| 无码人妻精品一区二区蜜桃色欲| 欧美美女搞黄| 成人精品免费视频| 午夜爽爽爽男女免费观看| 亚洲欧美国产制服动漫| 蜜桃精品视频在线| 成年人午夜免费视频| 欧美xxxx日本和非洲| www.精品视频| 久久综合999| 国产传媒av在线| 女同另类激情重口| 亚洲国产精品狼友在线观看| 国产呦精品一区二区三区网站| 麻豆精品国产传媒| 亚洲国产精品一区二区尤物区| 无码日韩精品一区二区免费| 国产成人在线视频播放| 李宗瑞系列合集久久| 日本在线观看网站| 91热精品视频| 国产精品伊人| 免费成人深夜夜行p站| 高清免费观看在线| 成人国产精品入口免费视频| 日韩中文字幕免费视频| 老司机aⅴ毛片免费观看| 国产在线一区二区视频| 狼人综合视频| h1515四虎成人| 欧美日本在线观看| 欧美.www| 区二区三区在线| 欧美成人午夜激情视频| 一区二区三区四区国产精品| 久久久久久欧美精品色一二三四| 综合婷婷亚洲小说| 自拍偷拍国产精品| 亚洲精品第五页| 一区二区三区四区在线不卡高清| ady日本映画久久精品一区二区| 在线精品视频小说1| 97超级在线观看免费高清完整版电视剧| 国产内射老熟女aaaa| 韩国一区二区三区四区| 日韩理伦片在线| 亚洲色偷精品一区二区三区| 日韩一区网站| 成人h片在线播放免费网站| 中文字幕一区二区三区四区欧美| 视频在线在亚洲| 国产精品电影一区| 久久青青草视频| 蜜月aⅴ免费一区二区三区| 日韩av有码| 美女的奶胸大爽爽大片| 激情av一区二区| 国卡一卡二卡三免费网站| 日韩美女免费观看| 成人av资源网| xnxx国产精品| 国产v日韩v欧美v| 国产精品最新在线观看| 免费电影一区二区三区| 免费毛片b在线观看| 中文av在线全新| 欧美一二三四区在线| 久久成人麻豆午夜电影| 高清视频在线观看一区| 精品一区二区男人吃奶| 欧美第一页在线| 91精品久久久久久久久久入口| 日韩精品视频免费在线观看| 欧美一区二区三区图| 亚洲成人av福利| 日本免费在线播放| 青草国产精品| 亚洲人成精品久久久久久| 亚洲欧美小说色综合小说一区| 美女裸体自慰在线观看| 国产精品99久久久久久久女警| 成人免费a**址| 久久久久青草大香线综合精品| 欧美自拍偷拍网| 一区二区三区三区在线| 三级黄色片网站| 女人被男人躁得好爽免费视频| 美女被到爽高潮视频| 3d动漫一区二区三区在线观看| 中文字幕在线国产精品| 亚洲精品久久久狠狠狠爱| 国产精品亚洲专一区二区三区| 美女黄色免费看| 九色|91porny| 无码人妻精品一区二区蜜桃百度| 欧美日韩五区| 北条麻妃高清一区| 亚洲v在线观看| 精品肉辣文txt下载| 97超碰国产精品| 国产88在线观看入口| av久久网站| 欧美视频在线一区二区三区| 4444亚洲人成无码网在线观看| 加勒比av一区二区| 色网在线观看| 成人高清伦理免费影院在线观看| 91麻豆精品国产91| 丰满少妇乱子伦精品看片| 欧美激情视频三区| 久久精品国产v日韩v亚洲| 国产视频一区二区在线观看| 人妻丰满熟妇av无码区hd| 在线日韩网站| 成人免费网站视频www| 久久久女女女女999久久| 国产成人亚洲精品自产在线| 亚洲成人自拍一区| 欧美精品在线观看| 亚洲国产日韩成人综合天堂| 自拍电影在线观看| 欧洲成人免费aa| 天天爱天天干天天操| 成人午夜黄色影院| 国产精品裸体一区二区三区| 成人女人免费毛片| 亚洲香肠在线观看| 中文字幕亚洲天堂| 久久久久久久av| 国产黄色在线看| 亚洲国产成人一区| 日本在线观看不卡| 91成人在线免费视频| bt欧美亚洲午夜电影天堂| 午夜精品久久久久久久99老熟妇| 欧美日韩一区在线| 久久久久久久香蕉| 国产xxxxxxxxx| 精品国产91乱码一区二区三区四区| 亚洲二区在线播放| 欧美不卡在线播放| 最近免费中文字幕中文高清百度| 欧美aaaaaaaa| 中文字幕免费高清视频| 欧美日韩二三区| 亚洲人成网77777色在线播放| 久久久久久久久久久久久久久国产| 亚洲精品一区二区18漫画| 黄色片久久久久| 中文字幕不卡在线观看| 宅男噜噜噜66国产日韩在线观看| 国产一区二区三区在线视频观看| 青青草久久伊人| 免费大片在线观看| 国产乱码一区| 久久精品视频在线免费观看| 国产精品网红直播| 伊人av在线com| aa在线视频| 久久视频免费在线观看| 国产女主播喷水高潮网红在线| 亚洲欧美综合另类在线卡通| 色喇叭免费久久综合| 亚洲欧美在线人成swag| 国产成人av一区二区三区在线| 国产一区二区影视| 国产伦精品一区二区三区照片| 免费在线观看不卡| 9191久久久久久久久久久| 成人福利免费观看| 九九热这里只有在线精品视| 人人澡人人澡人人看| 不卡av在线播放| 毛片不卡一区二区| 日本夜爽爽一二区| 国产无遮无挡120秒| 丁香花五月激情| 性无码专区无码| 欧美日韩亚洲视频| 欧美又粗又大又长| 国产不卡在线播放| 欧美日韩午夜电影网| 国产精品美腿一区在线看| 99re6热在线精品视频播放速度| 亚洲日本青草视频在线怡红院| 亚洲成a人片在线不卡一二三区| 成人性生交大免费看| 色综合影院在线观看| 精品国产免费人成电影在线观看四季| 免费精品视频在线| 日本中文字幕不卡免费| 免费不卡欧美自拍视频| 欧美精品777| 国产无遮挡裸体免费视频| 一本色道久久综合熟妇| 亚洲成av人影院| 奇米影视在线99精品| 喷水一区二区三区| 2021av在线| 国产精品成人无码专区| www.91av视频.com| 亚洲伊人第一页| 亚洲综合色婷婷在线观看| 欧美bbb人妖| 上原亚衣av一区二区三区| 中国女人内谢25xxxx免费视频| 久久久久亚洲视频| 蜜桃久久影院| 亚洲精品麻豆| 日本精品网站| 在线免费观看的av网站| 免费精品视频一区二区三区| 久草视频国产在线| 亚洲黄色在线网站| 久久精品国产美女| 亚洲精品无播放器在线播放| 国产91精品欧美| 日本在线观看天堂男亚洲| 成人美女在线视频| 综合国产视频| 老汉av免费一区二区三区| av免费看网址| 成人精品视频一区二区三区尤物| 亚洲国产精品成人综合| 国产一级理论片| 5566成人精品视频免费| 成年人视频大全| 嫩草影院入口一二三免费| 天堂在线一二区| 碰碰在线视频| 国产五月天婷婷| 日韩精品在线观看av| www.日本在线观看| 日韩中文字幕在线免费观看| 本网站久久精品| 国产精品亚洲lv粉色| 亚洲日本精品国产第一区| 久久av中文字幕| 日韩欧美有码在线| 可以看av的网址| 国产一精品一av一免费爽爽| 亚洲免费视频在线观看| 青青青视频在线免费观看| 先锋影音av在线|