前辈来说说,fastreport4 的用法 新接触fastreport4 不知道里面的ADOQUERY怎么动态赋语句,也查了不少帖子,没什么实际性的东西,借此高手就请发挥发挥吧 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 demo里面东西太浅了,很多实际应用的东西没有 比如说自带ADOQUERY的应用就没有 以前回復過的...使用FastReport adoquery 創建動態報表的幾個技巧: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; 当DEMO里面没有的时候,就说明这种用法极少用到或者在DEMO里有变通的用法。 http://blog.csdn.net/SmallHand/archive/2009/01/07/3727669.aspxhttp://blog.csdn.net/SmallHand/archive/2009/02/04/3861648.aspx 这一句:frxReport1.DataSets.Add(frxDBDataSet); 关于Delphi事件处理问题 怎样导入或导出Firebird数据库中的数据表? DLEPHI如何进行三层事务处理? 时间格式转换问题 下拉列表多选问题? 怎么实现这样的功能??? 如何将OLEVARIANT转化为对象变量类型呢?例如转为Recipients类型???立刻给分,up也有分!!!(豁出去了,大家帮忙) delphi6中只有一个udp控件,怎么用来侦测某个端口上的数据? 怎么判断数据库中的某一字段相同值一共有几个? 请教!手机短消息群发的问题。 cxPopupEdit 控件 如何实现excel中拆分窗口的效果
使用FastReport adoquery 創建動態報表的幾個技巧: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;