報表默認保存在項目窗體文件中,大多數狀況下,沒有更多的操做要深圳市, 所以,你不須要採起特別措施來載入報告.若是你決定保存報表到文件或是數據庫中 (這樣更靈活, 好比修改報表不用重編譯程序), 你可使用 「TfrxReport」 組件是加載和保存方法:數據庫
function LoadFromFile(const FileName: String; ExceptionIfNotFound: Boolean = False): Boolean;數組
按文件名加載報表. 第二個參數若是是「True」 而且報表文件沒找到, 將報異常. 如要報表加載完成,返回 「True.」緩存
procedure LoadFromStream(Stream: TStream);多線程
從流中加載一個報表ide
procedure SaveToFile(const FileName: String);工具
保存報表到指定的文件ui
procedure SaveToStream(Stream: TStream);this
保存報表到流線程
報表文件的擴展名默認爲「FR3」.設計
舉例:
frxReport1.LoadFromFile('c:\1.fr3');
frxReport1.SaveToFile('c:\2.fr3');
顯示報表設計窗體,調用「TfrxReport.DesignReport」 方法. 須要引用相關單元。
方法"DesignReport" 有兩個默認參數。
procedure DesignReport(Modal: Boolean = True; MDIChild: Boolean = False);
第一個參數控制是否以模態方式顯示窗體。第二個參數控制是否爲MDI子窗體。
舉例:
frxReport1.DesignReport;
使用「TfrxReport」組件如下的兩個方法啓動一個報表:
procedure ShowReport(ClearLastReport: Boolean = True);
啓動一個報表,並顯示預覽窗口. 若是參數「ClearLastReport」 等於「False」 報表將添加到先前建立好的報表後面, 不然先前的報表將清除 (默認).
function PrepareReport(ClearLastReport: Boolean = True): Boolean;
啓動一個報表,沒有預覽窗口. 參數跟方法「ShowReport」 同樣. 報表建立完成,返回「True」。
大多數狀況, 更多使用第一種方法. 會顯示預覽窗口, 繼續構建新報表.
參數「ClearLastReport」 方便控制如下狀況,當須要添加其餘報表時 。(批量打印報表等狀況)
舉例:
frxReport1.ShowReport;
預覽窗口顯示報表有2個方法: 一個是調用 「TfrxReport.ShowReport」 方法, 一個是調用「TfrxReport.ShowPreparedReport」 方法. 第二個方法中報表構建的動做不執行,但報表已經完成顯示. 這意味着,你能夠事先構建報表藉助「preparereport」方法, 或加載先前從文件加載的報表。
舉例:
if frxReport1.PrepareReport then
frxReport1.ShowPreparedReport;
在這種狀況下, 報表首先構建完成, 以後顯示在預覽窗體. 構建一個大報表可能花不少時間, 這就是爲何使用「showreport」(準同步方法),比使用「PrepareReport/ShowPreparedReport」更好. 能夠指定預覽方式,經過「tfrxreport.previewoptions」屬性進行設置。
大多數狀況, 你從預覽窗口打印報表. 手動打印報表,能夠調用「TfrxReport.Print」方法, 舉例:
frxReport1.LoadFromFile(...);
frxReport1.PrepareReport;
frxReport1.Print;
在同一時間, 彈出對話框,能夠設置打印參數,. 你能夠設置不顯示此對話框,設置「TfrxReport.PrintOptions」 屬性。
報表能夠在預覽窗口中執行此操做. 也能夠手動執行 「TfrxReport.PreviewPages」 方法:
function LoadFromFile(const FileName: String; ExceptionIfNotFound: Boolean = False): Boolean;
procedure SaveToFile(const FileName: String);
procedure LoadFromStream(Stream: TStream);
procedure SaveToStream(Stream: TStream);
配置和參數等與相應的TfrxReport方法同樣。一個文件中包含已完成的報告,其擴展名默認爲"fp3"。
舉例:
frxReport1.PreviewPages.LoadFromFile('c:\1.fp3');
frxReport1.ShowPreparedReport;
注意,此種完成的報表在加載完畢後,其預覽是經過「showpreparedreport」方法!
能夠在預覽窗口執行此操做. 也能夠手動調用「TfrxReport.Export」 方法. 方法的參數要指定要導出的文件類型,如:
frxReport1.Export(frxHTMLExport1);
導出組件必須可用 (組件放在窗體上) 並設置正確.
FastReport顯示報表在一個標準的預覽窗體中。 能夠建立自定義的預覽窗體,使用組件「TfrxPreview」。
使用組件時有兩個典型問題. 組件沒有處理相關按鍵(光標, PgUp, PgDown etc) 和鼠標滾動。 讓TfrxPreview 的按鍵能夠正常工做,把組件設置成當前的焦點 (好比在窗體的 OnShow 事件寫代碼處理),以下:
frxPreview.SetFocus;
讓TfrxPreview 組件能夠響應鼠標滾動操做, 你須要建立 OnMouseWheel 事件處理,並調用 TfrxPreview.MouseWheelScroll 方法,以下:
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
frxPreview1.MouseWheelScroll(WheelDelta);
end;
某些狀況下,在一次打印中須要幾個報表,或多個報表放在一個預覽窗口. FastReport中提供了工具,容許在已有報表上添加新的報表. «TfrxReport.PrepareReport» 方法有一個布爾型的參數選項 «ClearLastReport» , 默認等於 «True» .此參數定義是否清除以前構建的報表. 如下代碼演示加載多個報表:
frxReport1.LoadFromFile('1.fr3');
frxReport1.PrepareReport;
frxReport1.LoadFromFile('2.fr3');
frxReport1.PrepareReport(False);
frxReport1.ShowPreparedReport;
咱們加載第一個報表,並構建他,但不顯示. 當咱們用同一對象構建第二個報表時,參數 «ClearLastReport» 等於 «False». 這樣容許第二個報表添加到以前報表的後,最後在預覽窗口中顯示構建好的報表。
A:混合報表中的頁碼
你可使用«Page,» «Page#,» «TotalPages,» 和«TotalPages#» 等系統變量來顯示頁碼,在混合報表中,這些變量以意義以下:
Page – 當前報表的頁碼
Page# - 整批報表的頁碼(意即全局的)
TotalPages – 當前報表的全部頁彙總 (a report must be a two-pass one)
TotalPages# - 整批報表的頁碼彙總.
B:混合報表中組合頁
正如上面所說, 報表設計頁面中的 PrintOnPreviousPage 屬性讓你打印時接在前一頁, 即 使用前一頁的空白空間. 在混合型報表中, 容許你從前一報表的空白開始建立新的報表. 要執行此操做,你在設計每一個連續報表的第一頁時,打開 PrintOnPreviousPage 屬性。
交互式報表,在預覽窗口全部報表對象定義一個鼠標單擊的響應。例如,用戶能夠單擊數據行,而且運行新的報表顯示數據行的明細信息。
任何報表均可以成爲交互式報表. 要執行此操做,你須要建立一個 TfrxReport.OnClickObject 事件處理,舉例以下:
procedure TForm1.frxReport1ClickObject(Page: TfrxPage; View: TfrxView;Button: TMouseButton; Shift: TShiftState; var Modified: Boolean);
begin
if View.Name = 'Memo1' then
ShowMessage('Memo1 contents:' + #13#10 + TfrxMemoView(View).Text);
if View.Name = 'Memo2' then
begin
TfrxMemoView(View).Text := InputBox('Edit', 'Edit Memo2 text:', TfrxMemoView(View).Text);
Modified := True;
end;
end;
在事件«OnClickObject» 中, 你還能夠作如下事情:
- 修改頁或報表對象的內容(所以, «Modified» 標誌應該指定,所以該修改將考慮在內);
- 調用«TfrxReport.PrepareReport» 方法重建報表。
在上面例子中, Memo2修改了內容,因此設置了Modified := True.
以一樣的方式, 能夠定義不一樣的響應方式; 好比你能夠, 運行一個新的報表. 須要注意如下幾點。在FastReport 3 版本中, 一個TfrxReport組件只能在一個預覽窗體中顯示 (不像FastReport 2.x 版本). 這就是爲何要運行報表要在一個單獨的TfrxReport對象,或在同一個中,但當前的報表必須清除。
在可單擊的對象上給用戶一個提示信息,咱們能夠修改光標,設置對象的cursor 屬性。
可點擊的對象有一個細節問題可. 在簡單的報表中可使用對象的名字或內容,然而,在複雜狀況下不能使用. 例如,«Memo1» 的內容是'12'. 明細表根據這個獲取不能數據。 這就是爲何你須要主鍵。 FastReport 容許指定一個字符串, 包含任意思數據 (在這個例子中包含一個主鍵),全部對象使用«TagStr» 屬性保存這個字符串。
讓咱們以 FastReportDemo.exe - 'Simple list' demo爲例作說明. 這是一個公司客戶的列表, 包含有 «client’s name,» «address,» «contact perso,» etc. 數據源是«Customer.db» 表,來自數據庫DBDEMOS。 表的主鍵是«CustNo» 字段, 沒有顯示在報表上. 咱們決定全部對象用這個鍵關聯到記錄, 意即用主鍵獲取數據。要執行此操做, 在Master Data Band 上的全部對象的«TagStr» 屬性,輸入如下值:
[Customers."CustNo"]
構建報表期間, «TagStr» 屬性內容以一樣的方式計算, 如同文本對象那樣計算; 意即變量的值在全部變量的位置被替換, 在這個特殊狀況下的一個變量是被封閉在方括號中的。 類型將包含在«TagStr» 屬性中, 一個簡單的轉換從字符串到整數,將給咱們一個主鍵的值,這樣能夠找到須要的記錄。
若是主鍵是組合的 (好比包含了多個字段) ,«TagStr» 屬性內容像下面這樣:
[Table1."Field1"];[Table1."Field2"]
報表構建之後,«TagStr» 屬性包含值:'1000;1', 從中獲得主鍵的值是不難的。
FastReport報表對象(如report page, band, memo-object) 不能從你的代碼中直接訪問. 須要訪問,通«TfrxReport.FindObject» 方法找到對象:
var
Memo1: TfrxMemoView;
…
Memo1 := frxReport1.FindObject('Memo1') as TfrxMemoView; //這裏能用as ?
找到以後能夠訪問對象的屬性和方法。訪問page對象,經過 «TfrxReport.Pages» 屬性:
var
Page1: TfrxReportPage;
Page1 := frxReport1.Pages[1] as TfrxReportPage;
做爲一個規則, 多數報表用設計器建立,然而,有些狀況(好比報表是未知的) 須要手動建立報表,在代碼中。
手動建立報表, 應該按如下順序步驟:
- clear the report component 清除報表
- add data sources 添加數據源
- add the "Data" page 添加Data 頁
- add report’s page 添加一個或多個report 頁
- add bands on a page 在頁上添加一個或多個band
- set bands’ properties, and then connect them to the data 設置band的屬性鏈接到數據
- add objects on each band 在每一個band上添加須要的對象
- set objects’ properties, and then connect them to the data 設置對象的屬性,鏈接到須要的數據字段
讓咱們看看一個簡單«list»類型報表的建立,假設咱們有如下組件: frxReport1: TfrxReport 和frxDBDataSet1: TfrxDBDataSet (the last one is connected to data from the DBDEMOS, the «Customer.db» table). 報表將只有一頁,包含«Report Title» 和«Master Data» bands.在«Report Title» band 有一個"Hello FastReport!" 文本, 在«Master Data» 包含"CustNo" 字段。
var
DataPage: TfrxDataPage;
Page: TfrxReportPage;
Band: TfrxBand;
DataBand: TfrxMasterData;
Memo: TfrxMemoView;
{ clear a report }
frxReport1.Clear;
{ add a dataset to the list of ones accessible for a report }
frxReport1.DataSets.Add(frxDBDataSet1);
{ add the "Data" page }
DataPage := TfrxDataPage.Create(frxReport1);
{ add a page }
Page := TfrxReportPage.Create(frxReport1);
{ create a unique name }
Page.CreateUniqueName;
{ set sizes of fields, paper and orientation by default }
Page.SetDefaults;
{ modify paper’s orientation }
Page.Orientation := poLandscape;
{ add a report title band}
Band := TfrxReportTitle.Create(Page);
Band.CreateUniqueName;
{ it is sufficient to set the «Top» coordinate and height for a band }
{ both coordinates are in pixels }
Band.Top := 0;
Band.Height := 20;
{ add an object to the report title band }
Memo := TfrxMemoView.Create(Band);
Memo.CreateUniqueName;
Memo.Text := 'Hello FastReport!';
Memo.Height := 20;
{ this object will be stretched according to band’s width }
Memo.Align := baWidth;
{ add the masterdata band }
DataBand := TfrxMasterData.Create(Page);
DataBand.CreateUniqueName;
DataBand.DataSet := frxDBDataSet1;
{ the Top coordinate should be greater than the previously added band’s top + height}
DataBand.Top := 100;
DataBand.Height := 20;
{ add an object on master data }
Memo := TfrxMemoView.Create(DataBand);
Memo.CreateUniqueName;
{ connect to data }
Memo.DataSet := frxDBDataSet1;
Memo.DataField := 'CustNo';
Memo.SetBounds(0, 0, 100, 20);
{ adjust the text to the right object’s margin }
Memo.HAlign := haRight;
{ show the report }
frxReport1.ShowReport;
讓咱們解釋一些細節:
要在報表中使用數據源, 必須把數據源添加到DataSets,本例中調用了«frxReport1.DataSets.Add(frxDBDataSet1)» 。不然, 不能工做。
內部數據如TfrxADOTable能夠插入報表的「Data」頁,這樣的數據集能夠放置到「Data」頁。
Page.SetDefaults 不是必須的, 本例中使用 À4 格式,邊距爲 0 mm. SetDefaults 設置了10mm 邊距,頁大小和對齊方及默認打印機。
在頁中添加帶, 你應該確保他們不互相重疊. 設置足夠的«Top» 和«Height» 座標。 這裏不能修改«Left» 和«Width» 座標, 由於一個帶有頁寬度(在垂直帶時–你應該設置Left 和Width ,忽略 Top 和 Height)。須要注意的是,在頁面上的位置的順序是很是重要的,老是以一樣的方式定位帶,在設計器中也以一樣的方式。
對象的座標和大小以像素爲單位。因爲«Left,» «Top,» «Width,» and «Height» 屬性是 «Extended» 類型,你能夠設置成一個非整形值。 下面的常量被定義爲將像素轉換爲釐米和英寸(frxClass單元):
fr01cm = 3.77953;
fr1cm = 37.7953;
fr01in = 9.6;
fr1in = 96;
例如, 一個band的高等於 5 mm,你能夠設置以下:
Band.Height := fr01cm * 5;
Band.Height := fr1cm * 0.5;
十三:在窗體中經過代碼建立對話式報表
十四:修改報表的屬性
十五:在代碼的幫助下建立報表
The primary example’s code is located in the «FastReport Demos\PrintArray» ( "FastReport Demos\BCB Demos\PrintArray") directory. 讓咱們解釋幾個細節.
To print an array, we use a report with one «Master Data» band, which will be presented as many times, as there are elements in the array. To do this, place a «TfrxUserDataSet» component on the form, and then set it’s properties (it is possible to do it in a code, as shown in our example):
RangeEnd := reCount
RangeEndCount := a number of elements in an array
After that, we connect the data-band to the «TfrxUserDataSet» component. To represent the array element, place a text object with the [element] line inside the «Master Data» band. The «element» variable is filled using a «TfrxReport.OnGetValue» event.
The primary example’s code is located in the «FastReport Demos\PrintStringList» ( «FastReport Demos\BCB Demos\PrintStringList») directory. The method is the same, as in the example with an array.
十八:打印一個文件
十九:打印一個TStringGrid
二十:打印一個TTable和TQuery
二十一:報表繼承
FastReport能夠在不一樣的線程獨立運做,但有一些特色:
- 即便在不一樣的線程,你不能建立TfrxDBDataSet, 由於全局列表"global list" 被用於搜索,當訪問會發生在第一次建立TfrxDBDataSet對象時(你能夠關閉使用全局列表,默認狀況下它是激活的);
- 若是在報表執行過程當中有一些對象屬性作了變化(好比在腳本中:Memo1.Left := Memo1.Left + 10), 你須要記住在接下來的操做中,若是TfrxReport.EngineOptions.DestroyForms := False 報表模板將準備修改並須要從新加載或者使用TfrxReport.EngineOptions.DestroyForms := True。 在更新過程當中,您不能在線程中使用交互報表, 由於腳本對象在更新後被刪除, 這就是爲何在某些狀況下,使用TfrxReport.EngineOptions.DestroyForms:=False和更新本身的模板在下一個構建週期中。
If necessary the global list due to which you can search the needed copies of TfrxDBDataSet can be switched off.
{DestroyForms can be switched off, if every time you renew a report from a file or from a current}
FReport.EngineOptions.DestroyForms := False;
FReport.EngineOptions.SilentMode := True;
{ This property switches off the search through global list}
FReport.EngineOptions.UseGlobalDataSetList := False;
{EnabledDataSets plays local list role, you should install it before the template is loaded}
FReport.EnabledDataSets.Add(FfrxDataSet);
FReport.LoadFromFile(ReportName);
FReport.PrepareReport;
(能不用多線程儘可能不用)
The reports and it's data can be cached both in memory ( for speed increasing ) and in file on the disk ( for saving RAM recourses). There are several types of caching in Fast Report:
- TfrxReport.EngineOptions.UseFileCache - if the property is installed in True, than the whole text and objects of built report are saved in temporary file on disk, at that TfrxReport.EngineOptions.MaxMemoSize indicates how many MB are meant for the template in RAM .
- TfrxReport.PreviewOptions.PagesInCache - the number of pages which can be kept in cache memory greatly increases preview speed , but spends much memory ( especially when there are pictures in a template).
- TfrxReport.PreviewOptions.PictureCacheInFile - if the property is on, than all the pictures of built report are saved in temporary file on a disk, that greatly reduces memory use in reports with a large amount of pictures, but it reduces the speed.
FastReport能夠建立MDI風格的預覽和設計窗體。 The source code of the example is in FastReport Demos\MDI Designer catalogue.
值得一提的是,建議每一個預覽窗口或設計窗口建立本身的TfrxReport ,不然全部的窗口都會指向同一個TfrxReport。