DELPHI7.0軟件自帶有報表Quick Report組件,但是默認的情況下,工具欄中是沒有的,需要手動添加,步驟:
component->install packages->add->\borland\bin\dclqrt70.bpl
一、組件功能簡介
上面的兩個圖是QuickReport組件頁的中所有組件,在BCB6中提供給我們使用的不會少於上面的23個的。
下表是按上圖中組件的位置先后,對各控件的使用功能逐一做了簡單的介紹:
1)QuickRep
帶有坐標,作為其他報表控件(如TQRBand)的容器,通過它的Band屬性可以自動添加各種類型的TQRBand
重要屬性 (Properties)
使用說明
DataSet
連結數據來源,一般是ADO/BDE連接組件的名字
Page
紙張的設置,可展開
BottomMargin
10.0mm
報表下邊界尺寸
Columns
1
報表分欄數,默認為1欄
ColumnSpace
0.0mm
報表欄與欄間隔尺寸,Columns值大於1時有效
LeftMargin
10.0mm
報表左邊界尺寸
Length
210.0mm
報表長度尺寸,與PaperSize設置相關
Orientation
poPortrait
poLandscape
報表方向 打印方向,有下面兩個值:直印 poPortrait、橫印poLandscape
PaperSize
A4
報表打印紙張大小
RightMargin
10.0mm
報表右邊界尺寸
Ruler
true
報表標尺顯示
TopMargin
10.0mm
報表上邊界尺寸
Width
297.0mm
報表寬度尺寸,與PaperSize設置相關
PrinterSetting
Copies
1
報表復制份數
Duplex
false
報表雙重打印
FirstPage
0
報表打印起始頁
LastPage
0
報表打印終止頁
OutPutBin
Auto
報表輸出種類
ReportTitle
報表預覽打印標題
Units
mm
報表設計階段顯示標尺單位
2)QRSubDetail
建立一個主/明細(master/detail) 報表,連接明細文件的組件
3)QRStringsBand
可建立一讀取 TStrings 中項次值的組件。在這個組件里有一個Items屬性,若Items一個值(一行空、一回車行)都沒有,那他上面的組件將不會起作用。當String List Editor中有幾行,該組件上的內容就重復幾次。若只有一行內容時,她與一個DetailBand是一樣的;而多行時,也是差不多的,即先重復該區段內的可視組件幾次(幾行就幾次),然后下一個再重復。比如三行,那就是第一個數據來三行,然后第二個數據來三行,再然后,直到最后
4)QRBand
用來確定在報表的不同位置應該顯示什么內容,它上面可以放控件
5)QRChildBand
在報表中基礎子項條列組件。他有一個ParentBand屬性,你必須把他與其它band連接起來,只有這樣在她里面布置的組件才有效。說直接就是已經有了一個Band而你還需要一個這樣的組件,那就用她吧
6)QRGroup
在報表中對資料做邏輯上分組的組件。當你連接了幾個datasets到報表時可以通過Groups成組的對dataset進行操作
7)QRLabel
打印靜態的文本(即不是根據數據庫值來改變的),作用象Tlabel 。 Caption的內容就打印出來的內容;AutoStretch是布爾型變量,當標簽標題在設定范圍內不能打印時,該屬性將起作用,若為true,報表將繼續打印沒有打印完的文本,其它需要打印的文本將依次向后移動,反之,則超出部分不被打印
8)QRDBText
在報表中具有顯示連結資料來源的文字功能的組件
9)QRExpr
在報表中具有顯示陳述句或計算表示式值的組件
10)QRSysData
在報表中具有顯示系統信息的組件
11)QRMemo
在報表中顯示備注文字的組件
12)QRExprMemo
在報表中是TQRExpr 和 TQRMemo 的混合組件
13)QRRichText
在報表中具有顯示區域文字功能的組件
14)QRDBRichText
在報表具有顯示連結資料來源的區域文字功能的組件
15)QRShape
在報表中處理幾何圖形的組件,如方形、圓角方形、橢圓
16)QRImage
在報表中顯示靜態的圖片,包括(BMP,WMF,ICON)
17)QRDBImage
在報表中顯示從數據庫接收的圖片
18)QRCompositeReport
在報表中連結有關與無關的報表組件 ,用於創建混合報表的組件,可以把兩個或兩個以上的報表連接在一起,組成一個報表
19)QRPreview
在執行階段建立自訂預覽報表組件
20)QRTextFilter
將報表內容輸出於ASCII text 文件
21)QRCSVFilter
將報表內容輸出於CSV文件
22)QRHTMLFilter
將報表內容輸出於HTML文件
23)QRChart
可以在報表上應用的圖表工具
二、組件關系表
下圖說明了與QuickReport相關組件之間的連接與關系:
┌ADOTable<=| ┌QRChilderBand┐
DataBase<=ADO<=│ |<=====QuickRep<=====├QRBand │<===可視化組件
└ADOQuery<=| └QRStringBand ┘
數據庫 ADO引擎 報表容器組件 Band區段(容器) 可視化控件(顯示)
注意:可視化組件必須布置在相應的TQRBand區段上,否則將得不到要顯示的內容。BDE引擎與這個差不多,他與ADO只是與庫聯接方式不一樣,對QuickReport沒有什么影響。
有時有些朋友不小心把可視化組件放在窗體上了,而沒有直接放在TQuickRep組件中的各Band區段上,當把這些組件移到想要放置的區段時,發現這些組件不能用,所以你要切記:一定要把組件放在固定的區段上,並且在區段之間也是不能移動的。我們從Object TreeView中可以看到這些組件與TQuickRep是同一層,當然他不可能為TQuickRep工作了,只有他成為TQuickRep中的某一個區段(某個Band)的下一層時,才能正常工作。並且一定要放在一個區段中,不要誤認為放在TQuickRep上就行,如果你直接放在TQuickRep上,你的報表中將得不到什么L
三、最大容器TQuickRep
QuickReport中組織層次是特別嚴格的,TQuickRep是報表組件中必須有的,並且所有Band組件都必須放在她的上面,如果說每個Band區段都是一個小容器的話,那她就是一個最大的容器。想用好QuickReport,TQuickRep絕對不能只看作是一個類似Form的容器,如何用好她對我們用好QuickReport會起到關鍵性作用。
1)主要屬性:
DataSet是TDataSet數據集類型變量,用來設置報表使用的數據集組件對象,在主/明細報表中是主報表的數據集。若我們的報表要用到數據庫,她必須指定數據庫連接工具的名稱,否則你的程序將看不到數據庫中的數據。當然,在數據庫的連接組件中也一定要把Active設為true,讓不你只能在程序運行中動態的把數據庫打開,而在程序設計階段將看不到什么L
RecordCount 是數據集組件對象中記錄的數量;
RecordNumber是當前正在打印/顯示的記錄的索引(第一條記錄的索引是0);RecordCount、RecordNumber兩個屬性只有打開數據集對象之后,它們才可以訪問。
若報表組件成功地從數據集組件對象中提取數據,並生成報表,則Available的屬性值為true。
State屬性是報表狀態信息,它是枚舉型變量,可以有以下的取值:
qrAvailable:報表資源已准備好,可以預覽或打印;
qrPrepare:正在生成報表;
qrPreview:正在預覽報表;
qrPrint:正在打印報表;
qrEdit:正在編輯報表。
Description是TStrings類型屬性,它可以用來保存程序員對報表的簡單描述。主要是起提示作用。
Page屬性是TQuickRep組件中最重要屬性,它是TQRPage類型變量,用來設置報表的頁面屬性。報表組件為她提供了特殊的編輯器,使用組件的快捷菜單Report settings就可以打開Page的屬性編輯器窗口。在報表頁面屬性對話框上可以設置頁面的尺寸、邊框、分欄、區段等等頁面的屬性。當然我們也可以在對象查看器中點擊 Page前面的“+”展開它的所有屬性,並分別設置這些屬性。其中PagerSize是設置紙張大小的,他與Width、Length是密切相關的,改變PagerSize的值,后面兩個的值也會做出相應的變化,同樣,改變后兩個屬性時,PagerSize的值也會做出相應的改變。我們可以通過改變Orientation的值來改變打印的方向。Margins指的是報表顯示內容在PagerSize中的位置。Columns屬性我們一定注意,它是分欄設置,與WORD里的分欄設置是一樣的,無論出於何種目的,有時我們要把打印內容分成兩欄(或多欄)時,這時我們就要用到它,把它的值改為2(或實際欄數),至於欄間的距離我們通過Column space來設定。
Units屬性是用來設置紙張的顯示單位的,我們通常都選用mm(毫米),當然你要對其它比較了解也可以選用,但我認為最好不要選用其它項。
2)主要方法及事件
TQuickRep提供了大量方法以實現生成、預覽和打印報表的功能,但是,它的許多方法是私有成員函數,在類外不允許訪問。在實現報表功能時,應用程序經常需要調用Cancel、NewColumn、Preview、PreviewModal、PreviewModeless、Print、PrinterSetup和ResetPageFooterSize幾個方面。
Cancel 方法用來撤銷當前正在進行的操作,它與把TQuickRep 組件對象的Cancelled屬性設置為true是一樣的。
NewColumn、Print與PrinterSetup都是與打印有關的方法。其中NewColumn用來強制打印機從新欄開始打印,如果當前欄是頁面的最后一欄,則該方法將自動調用方法NewPage ,從新頁開始打印。
Preview、PreviewModal和PreviewModeless都是用來預覽報表的。
這些方法都不需要使用任何參數。
TQuickRep能夠響應的事件主要有:AfterPreview、AfterPrint、BeforePrint、OnEndPage、OnStartPage和OnPreview事件,這些事件的觸發與使用方法比較簡單,另外在實際應用中運用的並不多,這里就不再多說了。
四、 報表控件擺放的區段
作為報表,它通常有一個固定的模式,最常見的報表主要是由以下六部分組成:
PageHeader:頁眉,每頁均會出現
|
Title:標題, 只出現在第一頁
|
ColumnHeader:所有列的標題,即報表文件的字段區域,每頁只會出現一次
|
Detail:記錄的內容,一個字段一列,即報表的文本區域(重復區)
|
Summary:摘要(只出現在最后一頁)
|
PageFooter:頁腳,每頁均會出現
在QuickReport中,是通過不同的TQRBand區段來實現的。
TQRBand 是放在TQuickRep組件上面的一個容器,我們在其上面可以放置我們要打印的可視化QuickReport組件。而通過對TQRBand的BandType屬性的設置,我們可以改變TQRBand區段的類型,來實現不同區段的功能。
BandType是一個枚舉型變量,顯然上面常見報表組成表中的那六個部分也一定會出現在BandType的枚舉值中,只不過每個前面都加上了前綴rb。我們選擇不同的BandType值,就代表不同的區段類型,實現不同的功能,這一點必須注意。
實際上TQRBand的BandType屬性值不止上面的六個,她還有以下幾個值:
rbGroupHeader:組頁眉表格元,用於標志組頁中每一頁的開始,也用於TQRSubDetail;
rbGroupFooter:組頁腳表格元,與rbGroupHeader結合分隔出單頁,適用於TQRGroup和TQRSubDetail;
rbSubDetail:字數據表格元,無需手工設置;
rbChilder:字表格元,無需手工設置。
事實上,我們還可以在TQuickRep上來布置區段,我們只要把TQuickRep組件的Band屬性前面的“+”點開,就會看到上面那六個值(當然每個前面都加上了Has,可不是rb了),這些值都是布爾型的,我們想要用哪個區段類型的TQRBand,只要把其值設為true,就可以了。從這一點可以看出:前者可以更加靈活的布置Band區段,后者使用起來更加方便、快捷,至於到時候你用哪個,那就看你當時的心情與實際情況了。單純從結構嚴謹性上來講,還是通過TQRBand的BandType來設定區段類型更好一些,並且這樣做出的報表出現的問題最少。
五、報表運算組件TQRExpr與系統功能組件TQRSysData
報表運算組件TQRExpr用來提供一些簡單的計算功能。expression_r屬性是她的最重要屬性,我們有必要而且也必須掌握好她。
只要單擊expression_r右端的編輯按鈕就可以打開表達式編輯窗口。利用這個編輯器,我們可以比較方便的設計表達式。通過表達式編輯器窗口中的按扭,可以在表達式中插入數據庫中的表的字段、函數、數學和邏輯運算符,並可以通過Validate按扭來測試表達式的正確性。
當然,我們也可以直接在編輯器中輸入表達式。
在她的函數中IF你一定要用好,因為她會幫我們很多忙,這個函數的對於學過DBASE的程序愛好者來說應該是非常熟悉的,因為在這里她們的使用是一樣的;在C中,她與for(;;)語句或“?:”表達式差不多。她的具體使用格式如下:
IF(條件式,為真用這句,為假用這句)
系統功能組件TQRSysData可以為我們提供一些經常用到的系統功能。為了實現這些功能,他提供了兩個重要屬性Data和Text。
Data是一個枚舉類型變量,它有七個取值,如下表:
系統功能類型表(Data取值表)
系統功能類型
功能描述
qrsTime
系統時間
qrsDateTime
系統日期和時間
qrsDetailCount
需要打印的記錄數量
qrsDetailNo
正在打印的記錄索引
qrsPageNumber
正在打印的頁
qrsReportTitle
報表標題
qrsDate
系統日期
Text屬性是字符串類型變量,用來構成完整的系統功能字符串。
Data和Text這兩個屬性通常是一起使用的。如果將Text設置為“打印時間:”,而將Data設置為qrsDataTime,則系統打印結果為“打印時間:2003-9-21 13:08:12”的形式。
許多情況下,我們更想打印如“第1頁”這樣格式的頁碼,使用上面的屬性是不能實現的,這就要我們編寫代碼來實現。在打印/顯示報表時,應用程序將觸發OnPrint事件句柄。這樣我們只要在報表運算組件TQRExpr或系統功能組件TQRSysData的OnPrint中寫下如下代碼就可以實現了:
void __fastcall TForm1::TQRExpr1Print(TObject *sender, AnsiString &Value)
{
Value="第"+Value+"頁";
}
//-------------------------------------------------------------------
或
void __fastcall TForm1::TQRSysData1Print(TObject *sender, AnsiString &Value)
{
Value="第"+Value+"頁";
}
//-------------------------------------------------------------------
通過這兩段代碼我們可以知道,原來這兩個組件顯示或起作用的就是Value,如果我們不修改Value的值,則直接打印Value內容。由於我們在OnPrint事件中修改了她的值,從而改變了打印的內容。
注意:有些朋友把上面代碼輸入了進去,卻得不到正確的內容,原因很簡單:TQRSysData的Data屬性值設置不對,這個例子中我們要得到頁數,看一下Data的值是不是qrsPageNumber,並且Text的值是否為空;對於TQRExpr組件,你是否通過expression_r編輯器的Variable按鈕進入了下一頁,選擇了PAGENUMBER值?這是你不能正確實現代碼的問題所在。
六、TQRShape組件
TQRShape組件可以在報表上輸出一些簡單的圖形,設置它的Shape屬性可以選擇不同的圖形,但它主要用於繪制表格線,因此與TShape有些不同,下面我們來看一下Shape的取值:
TQRShape組件Shape屬性取值表
Shape屬性取值
意義
qrsCircle
畫圓
qrsHorLine
畫水平直線(Height要設為1或其它)
qrsRectangle
畫矩形
qrsRightAndLeft
僅在矩形左右繪直線
qrsTopAndBottom
僅在矩形上下繪直線
qrsVertLine
畫垂直線(Width要設為1或其它)
作為畫圖組件她的四個位置屬性最為重要,它們是Top、Left、Height和Width。其實對於QuickRep的絕大多數組件來說,這四個屬性也是非常重要的。
在Shape屬性值為QrsHorLine/ QrsVertLine時,Height/Width的屬性值要改為1或其它,這取決於你線條的寬度。
Brush屬性用來設置幾何圖形內部的填充風格,它包括填充顏色Color和填充圖案Style。
Pen屬性用來設置用於畫圖的畫筆的屬性,它包括Color、Style、Mode、Wide等。
TQRShape組件與TShape組件有許多相同之處,但也有一些不同之處,象Shape屬性的取值等等,我們一定注意。其實通過對兩個類似組件的對比學習,會加深我們對她們的掌握。如果運用得當,漂亮的線條就會出現在我們面前。
對於TQRShape組件的使用來說更多的是熟練,她應該是所有QuickReport組件中最好掌握的一個了,使用率也是最高的一個,並且TQRShape在表格設計中的作用是其它組件所不能取代的