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

首頁 > 編程 > Delphi > 正文

在Delphi中動態生成QuickReport報表

2019-11-18 18:36:20
字體:
來源:轉載
供稿:網友

----筆者在前一段使用Delphi開發數據庫的工作中,用戶提出了這樣一個需求:要根據自己的的查詢結果動態生成報表然后進行打印。幾經摸索,筆者使用動態生成QuickReport控件的方法滿足了用戶的需求?,F將此方法說明如下,希望能為有類似工作要做的朋友們提供一點有益的提示。

 

一、基本思路

----先將查詢的一些參數(如SQL命令,字段名稱,字段寬度等)按照一定格式寫入一個臨時文件中。在生成報表時,根據臨時文件中所記錄的參數動態生成各種QuickReport控件即可。

 

二、程序實現

2.1臨時文件格式

----臨時文件的格式可以根據需要自定義,筆者采用了INI的文件格式。Delphi提供了一個TInifile類,使得在Delphi中操作INI格式文件,非常方便。關于INI文件的格式和具體操作相關的文章有不少,我這里不再贅述。臨時文件格式如下:

Report.ini 

:報表細節

[rep_detail]

Title=XXXXX

:打印紙設置,1A4,2B5,316K

Page=1

:打印方式,1為橫打,0為豎打

Orientation=1

:報表包含的字段數目

columns=8

 

:TQurey組件信息

[QureyData]

QuickReport組件中Tqurey組件的SQL命令的內容

Sql_command=select V_XM,V_JGZW,V_BMMC,V_DWMC,V_DWZW,V_ZY,V_ZC,V_BGDH from Hvzzjg where V_XM  LIKE '%'

 

[col_0]

Caption= 

DataFiled=V_XM

Width=60

……

……

 

2.2動態生成QuickReport報表

--- 報表的主要控件及其主要屬性設置如下

控件名稱

類名

屬性

屬性值

Form_rep

TForm

caption

動態報表

QuickRep

TQuickRep

DataSet

REP_QUERY

DetailBand1

TQRBand

BandType

rbDetail

ColumnHeaderBand1

TQRBand

BandType

rbColumnHeader

REP_DataSource

TDataSource

DataSet

Rep_Query

Rep_Query

TQuery

DatabaseName

REPDATABASE

Rep_Database

 

TDatabase

 

Connected

True

Params.Strings

'SERVER NAME=XXX

'USER MAME=XXX'

'PASSWord=XXX'

DatabaseName

REPDATABASE

上表所示控件是在程序中手工創建的。其他的控件則要在程序中動態創建。

2.2.2主要程序

unit f_rep;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, ExtCtrls, QuickRpt, QRCtrls, DB, DBTables,PRINTERS,QRPrntr,inifiles,

  TeeProcs, TeEngine, DbChart, QRTEE;

 

type

  TForm_rep = class(TForm)

    QuickRep: TQuickRep;

    DetailBand1: TQRBand;

    ColumnHeaderBand1: TQRBand;

    REP_DataSource: TDataSource;

    REP_QUERY: TQuery;

    rep_Database: TDatabase;

    procedure TForm_rep.QuickRepAfterPreview(Sender: TObject);//瀏覽完畢,釋放所有創建的組件

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var  Form_rep:TForm_Rep;

    type //報表的摘要信息

       C_rep_Summary=record

         Title:string;//報表的標題

         Page:TQRPaperSize;//報表的頁面設置,采用何種型號的紙

         Orientation:TPrinterOrientation;//報表的頁面設置,是橫打還是豎打

         Columns:integer;//報表包含的列數

     end;

 

     type

        C_Rep_Col_Summary=record//報表列的摘要信息

           Caption:string;//報表的列名

           DataFiled:string;//報表的列所對應的數據庫中的字段名

           Width:integer;//報表的列寬

     end;

 

     type

        C_Rep_Col_Sum_store=record //存儲報表列的摘要信息

         Caption_array:array of string;

         DataFiled_array:array of string;

         Width_array:array of integer;

     end;

var 

     rep_Summary:C_rep_Summary;

     Rep_Col_Summary:C_Rep_Col_Summary;

     Rep_Col_Sum_store:C_Rep_Col_Sum_store;

     Colum_Name:array of tQRRichText;

     Colum_Data:array of TQRDBRichText;

     C_Query:TQuery;

    

 

procedure  Form_rep_init();

procedure DynCreat_TQRDBText(Colum_Num:integer;Colum_Height:integer;DataSet_Name:TQuery);//動態創建TQRDBText控件

procedure  DynCreat_TQRRichtext(Colum_Num:integer);//動態創建TQRRichtext控件

procedure  DynCreat_TQuery(Inifile_Name:Tinifile);//動態創建TQuery控件的SQL語句

procedure  Get_PageCount();//取得打印總頁數

function   Open_IniFile():Tinifile;//打開臨時文件

procedure  Read_Col_Summary(Inifile_Name:Tinifile);//讀取報表列的摘要信息

procedure  Read_Rep_Summary(Inifile_Name:Tinifile);//讀取報表的摘要信息

function   rep_chanslateOrientation(var Rep_Orientation:integer):TPrinterOrientation;//將打印方式設置進行轉換

function rep_chanslatepage(var Rep_Page:integer):TQRPaperSize;//將打印頁尺寸設置進行轉換

 

implementation

 

{$R *.dfm}

 

function rep_chanslatepage(var Rep_Page:integer):TQRPaperSize;//將打印頁類型設置進行轉換

begin

    case  Rep_Page of

1:begin

           result:=A4;

           Form_rep.QuickRep.PrinterSettings.PaperSize:=A4;

         end;

       2:begin

           result:=B5;

           Form_rep.QuickRep.PrinterSettings.PaperSize:=B5

         end;

       3:begin

           result:=Executive;

           Form_rep.QuickRep.PrinterSettings.PaperSize:=Executive;

         end;

    end;

end;

 

function rep_chanslateOrientation(var Rep_Orientation:integer):TPrinterOrientation;//將打印方式設置進行轉換

begin

    case  Rep_Orientation of

       0:begin

           result:=poPortrait;//0為豎直

           Form_rep.QuickRep.PrinterSettings.Orientation:=poPortrait;

         end;

       1:begin

           result:=poLandscape;//1為水平

           Form_rep.QuickRep.PrinterSettings.Orientation:=poLandscape;

         end;

    end;

end;

 

function  Open_IniFile():Tinifile;//打開臨時文件

var Filename:string;

    Ini_Filename:string;

begin

     Filename:=’Report.ini’;

     Ini_Filename:=File_Path+Filename;

     Result:=Tinifile.Create(Ini_Filename);

end;

 

procedure Read_Rep_Summary(Inifile_Name:Tinifile);//讀取報表的摘要信息

var  Rep_Page,Rep_Orientation:integer;

begin

    rep_Page:=Inifile_Name.Readinteger('rep_detail','Page',1);

    Rep_Orientation:=Inifile_Name.Readinteger('rep_detail','Orientation',0);

    with  rep_Summary do

     begin

       Columns:=Inifile_Name.Readinteger('rep_detail','columns',0);

       Title:=Inifile_Name.Readstring('rep_detail','Title','未命名報表');

       page:=rep_chanslatepage(Rep_Page);//將打印頁尺寸進行轉換

       Orientation:=rep_chanslateOrientation(Rep_Orientation);//將打印方式設置進行轉換

     end;

end;

 

procedure  Read_Col_Summary(Inifile_Name:Tinifile);//讀取報表列的摘要信息

var i_count:integer;

begin

     //將列信息保存在數組中

     with Rep_Col_Sum_store do

     begin

       SetLength(Caption_array,rep_Summary.Columns);

       SetLength(DataFiled_array,rep_Summary.Columns);

       SetLength(Width_array,rep_Summary.Columns);

     end;

     for i_count:=0 to rep_Summary.Columns-1 do

     begin

       with Rep_Col_Summary do

         begin

           Caption:=Inifile_Name.Readstring('col_'+inttostr(i_count),'Caption','未命名');

           DataFiled:=Inifile_Name.Readstring('col_'+inttostr(i_count),'DataFiled','');

           Width:=Inifile_Name.Readinteger('col_'+inttostr(i_count),'Width',0);

         end;

       with Rep_Col_Sum_store  do

         begin

           Caption_array[i_count]:=Rep_Col_Summary.Caption;

           DataFiled_array[i_count]:=Rep_Col_Summary.DataFiled;

           Width_array[i_count]:=Rep_Col_Summary.Width;

         end;

    end;

end;

 

procedure DynCreat_TQRRichtext(Colum_Num:integer);//動態創建TQRRichtext控件,此控件用來顯示報表每列的中文名稱

var Colum_Name_list:TStrings;

begin

     Colum_Name[Colum_Num]:=tQRRichtext.Create(application); //創建TQRRichtext控件

     Colum_Name[Colum_Num].Parent:=Form_rep.ColumnHeaderBand1;

     Colum_Name[Colum_Num].Frame.DrawTop:=true;

     Colum_Name[Colum_Num].Frame.DrawBottom:=true;

     Form_rep.ColumnHeaderBand1.Height:=40;

     Colum_Name[Colum_Num].Height:=40;

     Colum_Name[Colum_Num].Font.Height:=-14;

     Colum_Name[Colum_Num].Font.Name:='黑體';

     Colum_Name[Colum_Num].Top:=0;

     Colum_Name[Colum_Num].Alignment:=taCenter;

     Colum_Name[Colum_Num].AutoStretch:=false;

      //畫表格線

     Colum_Name[Colum_Num].Frame.Style:=psSolid;

     Colum_Name[Colum_Num].Frame.Width:=1;

     Colum_Name[Colum_Num].Frame.DrawRight:=true;

     Colum_Name[Colum_Num].Frame.DrawBottom:=true;

     if Colum_Num=0 then

        begin

          Colum_Name[Colum_Num].Frame.DrawLeft:=true;

        end;

     //將記錄RRep_Col_Sum_store中的信息賦給Colum_Name

     Colum_Name_list:=TStringList.Create;

     Colum_Name_list.Add(Rep_Col_Sum_store.Caption_array[Colum_Num]);

     Colum_Name[Colum_Num].Lines:=Colum_Name_list;

     Colum_Name[Colum_Num].Width:=Rep_Col_Sum_store.Width_array[Colum_Num];

     Colum_Name[Colum_Num].Visible:=true;

     //計算左邊界

     if Colum_Num>0 then

        Colum_Name[Colum_Num].Left:=Colum_Name[Colum_Num-1].Left+Colum_Name[Colum_Num-1].Width

     else

        Colum_Name[Colum_Num].Left:=0;

end;

說明:此處采用TQRRichtext控件是因為當名稱過長時,TQRRichtext控件可以自動換行。

    

procedure DynCreat_TQRDBText(Colum_Num:integer;Colum_Height:integer;DataSet_Name:TQuery);//動態創建TQRDBText控件,此控件用來顯示每列的值

begin

Colum_Data[Colum_Num]:=tQRDBText.Create(application);

    Colum_Data[Colum_Num].Parent:=Form_rep.DetailBand1;

    //設置數據集

    Colum_Data[Colum_Num].DataSet:=DataSet_Name;

    //將數組Colum_Data.DateField屬性設置為C_Rep_Col_Sum_store中的字段名

    Colum_Data[Colum_Num].DataField:=Rep_Col_Sum_store.DataFiled_array[Colum_Num];

    Colum_Data[Colum_Num].Width:=Rep_Col_Sum_store.Width_array[Colum_Num];

    Colum_Data[Colum_Num].Height:=Colum_Height;

    Form_rep.DetailBand1.Height:=Colum_Height;

    Colum_Data[Colum_Num].Top:=0;

    Colum_Data[Colum_Num].AutoSize:=false;

    Colum_Data[Colum_Num].AutoStretch:=false;

    Colum_Data[Colum_Num].WordWrap:=false;

    Colum_Data[Colum_Num].Visible:=true;

    //畫表格線

    Colum_Data[Colum_Num].Frame.Style:=psSolid;

    Colum_Data[Colum_Num].Frame.DrawRight:=true;

    Colum_Data[Colum_Num].Frame.DrawBottom:=true;

    if Colum_Num=0 then

      Colum_Data[Colum_Num].Frame.DrawLeft:=true;

    //計算左邊界

     if Colum_Num>0 then

       Colum_Data[Colum_Num].Left:=Colum_Data[Colum_Num-1].Left+Colum_Data[Colum_Num-1].Width

     else

        Colum_Data[Colum_Num].Left:=0;

end;

 

procedure DynCreat_TQuery(Inifile_Name:Tinifile);//動態設置TQuery控件的SQL語句

var

    Sql_command:string;

begin

     Flag_CreatQuery:=false;

     Sql_command:=Inifile_Name.Readstring('QureyData','Sql_Command','');

     Form_rep.REP_QUERY.Close;

     Form_rep.REP_QUERY.SQL.Clear;

     Form_rep.REP_QUERY.SQL.Append(Sql_command);

     if not Form_rep.REP_QUERY.Prepared then

       Form_rep.REP_QUERY.Prepare;

     try

       Form_rep.REP_QUERY.ExecSQL;

       Form_rep.REP_QUERY.Active:=true;

       Form_rep.REP_QUERY.AutoCalcFields:=true;

       Flag_CreatQuery:=true;

     except

       Application.MessageBox('SQL語句錯誤!','系統提示',MB_ICONWARNING);

       Flag_CreatQuery:=false;

     end;

end;

 

procedure Form_rep_init();

var  i_count:integer;

     Rep_IniFile:Tinifile;//

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97久久精品国产| 久久久免费精品视频| 97国产精品视频人人做人人爱| 欧美色欧美亚洲高清在线视频| 一区二区三区回区在观看免费视频| 俺也去精品视频在线观看| 亚洲国产一区二区三区在线观看| 欧美一级淫片videoshd| 日韩欧美国产免费播放| 欧美大学生性色视频| 久久精品视频免费播放| 日韩中文视频免费在线观看| 国产精品久久9| 欧美电影在线免费观看网站| 7777精品视频| 欧美体内谢she精2性欧美| 性欧美xxxx视频在线观看| 国产精品三级美女白浆呻吟| 久久久久免费视频| 91av在线免费观看| 亚洲国产成人精品一区二区| 欧日韩在线观看| 亚洲精品www久久久久久广东| 97在线视频精品| 精品亚洲一区二区三区在线观看| 欧美区在线播放| 在线看国产精品| 亚洲综合第一页| 日韩av123| 国产专区欧美专区| 国产大片精品免费永久看nba| 国产精品久久久久999| 欧美性猛交xxxx乱大交3| 久久影院模特热| 亚洲午夜未满十八勿入免费观看全集| 国产成人啪精品视频免费网| 性欧美办公室18xxxxhd| 色偷偷av一区二区三区乱| 国产精品久久久久免费a∨大胸| 国产视频久久网| 欧美在线一区二区视频| 亚洲精品电影久久久| 91大神在线播放精品| 国模精品系列视频| 成人日韩av在线| 麻豆国产va免费精品高清在线| 国产精品免费小视频| 45www国产精品网站| 亚洲国产欧美精品| 国产精品电影网| 亚洲香蕉伊综合在人在线视看| 久久成人18免费网站| 国产婷婷97碰碰久久人人蜜臀| 欧美成人激情视频| 日韩精品免费电影| 91高清在线免费观看| 高清欧美性猛交xxxx黑人猛交| 久久久精品2019中文字幕神马| 欧美性猛交丰臀xxxxx网站| 亚洲精品av在线| 亚洲风情亚aⅴ在线发布| 欧美xxxx14xxxxx性爽| 日韩在线观看免费av| 亚洲视频在线观看网站| 性欧美视频videos6一9| 78m国产成人精品视频| 亚洲天堂第一页| 亚洲伊人久久综合| 欧美色视频日本版| 国产精品视频免费在线观看| 午夜精品国产精品大乳美女| 亚洲深夜福利在线| 欧美成年人网站| 欧美日韩国产123| 久久天天躁狠狠躁夜夜躁2014| 国产精品久久一| 国产日韩精品在线播放| 亚洲va久久久噜噜噜久久天堂| 色先锋资源久久综合5566| 亚洲国产美女久久久久| 疯狂欧美牲乱大交777| 亚洲日本成人女熟在线观看| 国模精品一区二区三区色天香| 欧美成人三级视频网站| 国产精品十八以下禁看| 午夜精品视频在线| 国产日韩欧美成人| 97视频免费在线看| 亚洲新声在线观看| 欧美中文字幕视频| 国语自产在线不卡| 久久天堂av综合合色| 黑丝美女久久久| 欧美黑人性生活视频| 欧美视频第一页| 国产精品久久av| 国产精品电影久久久久电影网| 欧美福利视频在线| xx视频.9999.com| 在线观看日韩av| 777国产偷窥盗摄精品视频| 亚洲国产私拍精品国模在线观看| 97av视频在线| 亚洲无亚洲人成网站77777| 精品亚洲永久免费精品| 国产色视频一区| 日韩av在线一区二区| 亚洲无限av看| 国产精品永久免费视频| 国产精品91免费在线| 亚州av一区二区| 国产一区二区视频在线观看| 亚洲激情免费观看| 国产午夜精品全部视频在线播放| 欧美精品中文字幕一区| 久久偷看各类女兵18女厕嘘嘘| 91在线直播亚洲| 一本色道久久88亚洲综合88| 色妞色视频一区二区三区四区| 国产亚洲欧美日韩精品| 欧美激情精品久久久久久变态| 欧美电影免费观看电视剧大全| 亚洲精品www久久久| 国产精品毛片a∨一区二区三区|国| 日韩av免费看网站| 2019精品视频| 亚洲国产精品久久久久| 国产中文字幕91| 欧美另类99xxxxx| www.欧美免费| 国产精品狠色婷| 狠狠躁天天躁日日躁欧美| 亚洲摸下面视频| 亚洲大胆美女视频| 国产视频精品免费播放| 亚洲视频视频在线| 国产一区二区三区网站| 日韩成人av在线播放| 最近中文字幕日韩精品| 国产午夜精品麻豆| 91精品久久久久久久久久久| 欧美高清在线观看| 在线看欧美日韩| 亚洲国产日韩欧美在线图片| 亚洲在线观看视频| 国产97人人超碰caoprom| 国产成人精品视频在线| 992tv成人免费影院| 精品偷拍一区二区三区在线看| 韩国美女主播一区| 亚洲永久在线观看| 亚洲欧美制服另类日韩| 九九热99久久久国产盗摄| 日韩美女免费线视频| 国产精品国产亚洲伊人久久| 精品成人在线视频| 亚洲精品中文字幕女同| 亚洲成av人片在线观看香蕉| 北条麻妃一区二区在线观看| 91精品国产自产在线| 日韩视频一区在线| 亚洲欧洲xxxx| 久久99久久99精品中文字幕| 成人亚洲综合色就1024|