1.已經產生的報表儲存到流中,再從流中取出
TfrxReport.PreviewPages.SaveToStream(TStream);
TfrxReport.PreviewPages.LoadFromStream(TStream);
2.把變數添加到報表中
with frxReport1 do
begin
with Variables do
begin
Category:=Add;
Category.Name := ' ' + '自訂變數1'; //注意!!第一個' '內是一個空格!!如果沒有空格,不能正確添加分類
with Add do Name := ' ' + '自訂變數2'; //更簡化的格式
AddVariable('自訂變數1', '變數11', QuotedStr('大寫金額'));
AddVariable('自訂變數1', '變數12', QuotedStr('大寫金額'));
AddVariable('自訂變數1', '變數13', QuotedStr('大寫金額'));
AddVariable('自訂變數2', '變數21', 1880);
AddVariable('自訂變數2', '變數22', QuotedStr('大寫金額'));
AddVariable('自訂變數2', '變數23', QuotedStr('大寫金額'));
end;
end;
3.動態添加資料集,要注意!!!!!
在取報表格式之前,應該先把資料集對象放好,這樣才能保證在報表控制項在取格式檔案後,
安置報表對象時,可以拿到資料對象,如果操作順序搞反了,則報表對象就無法
拿到資料對象,在預覽資料時,就會產生“沒有資料集”的錯誤了!!
var
tmpDataSet: T資料集;
DataSource: TDataSource;
frxDBDataSet: TfrxDBDataset;
begin
tmpDataSet:=T資料集.Create(Self);
DataSource:=TDataSource.Create(Self);
frxDBDataSet:=TfrxDBDataset.Create(Self);
DataSource.DataSet:=tmpDataSet;
frxDBDataSet.DataSource:=DataSource;
//frxDBDataSet.DataSet:=tmpDataSet; //這條語句與上一條都可用,我也不知道區別在哪
frxDBDataSet.UserName:='資料項目名稱'; //好用在於可以用中文名
frxReport1.DataSets.Add(frxDBDataSet);
-------------注意:在把報表格式LoadFromFile或LoadFromStream之前,必須完成上面這幾條語句的程式!!!!
4.將報表設定資料儲存到流中,只要設定TfrxDesigner.OnSaveReport就可以了,但不知道這東西怎麼和Report聯結起來的,只需要在介面上放一個控制項就OK了,怪怪的,不過挺爽
5.自訂預覽視窗
通過引用frxPreview來建立繼承類TfrxPreview,然後在繼承的類中加入自己的特性,這樣是最省事的了
6.處理順序的信條(真理):假設報表範本是儲存在資料庫中的
a.必須在把報表範本提取出來前,把表對象注入資料中,否則在預覽時就知錯
b.必須在在把報表範本提取出來後,再把動態變數加到報表中,否則看不到變數存在
這兩個順序必須當信條來理解,至於什麼原因,偶還沒空看FastReport的來源程式咧,嘿嘿~~,這兩個處理機制可是偶經過了N多失敗之後才發現的哦
7.添加自訂函數
a.建立自己的函數,可以是類的成員函數(要注意執行個體化類喲),也可以是全域函數
b.用TfrxReport.AddFunction把函數加到註冊項中,注意,必須是函數的完整定義,比如,你的函數是:
function MyFunction(Para0: Float): string;
那麼AddFunction格式應該這樣:
frxReport1.AddFunction('function MyFunction(Para0: Float): string','自訂函數','');
c.必須在TfrxReport.OnUserFunction中對函數的傳回值進行處理,否則在報表中即使寫的格式正確,也沒有傳回值,這是必須注意的
8.在自訂函數中使用報表中的對象
a.建立自訂函數
function TForm1.GetCrossObject(CrossObj: TfrxCustomCrossView): string;
begin
// 取資料對象
Result:='行數:'+IntToStr(CrossObj.Matrix.RowCount);
end;
b.註冊函數,可以在Form1.Create時註冊哦
with frxReport1 do
begin
AddFunction('function GetCrossObject(CrossObj: TfrxCustomCrossView): String',
'擴充函數', '');
end;
c.必須在TfrxReport.OnUserFunction中對函數的傳回值進行處理
function TForm1.frxReport1UserFunction(const MethodName: String;
var Params: Variant): Variant;
begin
if UpperCase(MethodName)=UpperCase('GetCrossObject') then
Result:=GetCrossObject(TfrxCustomCrossView(Integer(Params[0]))); //類型轉換才能編譯通過哦
end;