TfrxReport总结

TfrxReport
此为最主要的报表元件,一个 TfrxReport 元件组成一份报表。在设计时期,双击此
元件可打开报表设计器(Report Designer),此元件拥有所有载入、存盘、设计及来看
报表必须的属性及方法。

 

TfrxReport 提供的方法:

 

procedure Clear;
    清除报表

 

function LoadFromFile(const FileName: String; ExceptionIfNotFound: Boolean = False): Boolean;
    从给予的文件载入报表。假如第二个参数等于 “True”且文件不存在,将产生例外状况, 假如文件载入成功,返回值为”True ” 。

 

procedure LoadFromStream(Stream: TStream);
    从数据流(stream)载入报表。

 

procedure SaveToFile(const FileName: String);
    保存报表至指定的文件。

 

procedure SaveToStream(Stream: TStream);
    保存报表至数据流(stream)。

 

procedure DesignReport;
    进入报表设计环境。报表设计环境将嵌入在你的工程文件 要执行此功能,只要在 uses 句加入 frxDesign单元或在工程文件中加入“TfrxDesigner” 元件。

 

procedure ShowReport(ClearLastReport: Boolean = True);
    开始制作报表并输出结果显示在预览窗口。例如“ClearLastReport”参数等于“False”,报表将会加入至前一个报表的后面,否则前一个建立的报表会被清除预置值 。

function PrepareReport(ClearLastReport: Boolean = True): Boolean;
    开始制作报表,但沒有显示预览窗口。参数指定方式与“ShowReport” 方法(method)相同。假如报表创建成功,此函数返回“True” 。

 

procedure ShowPreparedReport;
    显示先前使用“PrepareReport” 所建立的报表。

 

procedure Print;
    打印报表。

 

procedure Export(Filter: TfrxCustomExportFilter);
    使用指定的导出过滤器(exportfilter)导出报表內容。因为下列的方法只提供一种服务在大部分的情況之下,你并不须要使用它们。在增強 FastReport 的报表功能方面,他们可能是很有用的。例如,当撰写自定义的报表元件时。

 

function Calc(const Expr: String): Variant;
    计算“Expr” 运算式并返回结果。

 

function GetAlias(DataSet: TfrxDataSet): String;
    返回指定数据集 (dataset)的别名。

 

function GetDataset(const Alias: String): TfrxDataset;
    返回指定别名(Alias)的数据集。

 

procedure DoNotifyEvent(Obj: TObject; const EventName: String);
    执行连接至”Obj” 物件的“EventName”事件处理程序。

 

procedure DoParamEvent(const EventName: String;var Params:Variant);
    以任意的参数类型执行 “EventName”的事件处理程序。

 

procedure GetDatasetAndField(const ComplexName: String; var Dataset: TfrxDataset; var Field: String);
    解析“ComplexName”复合名称(以DataSet.”Field”表示),并返回参照的数据集及字段名称。

 

procedure GetDataSetList(List: TStrings; OnlyDB: Boolean = False);
    从 List参数返回报表可用的数据集列表,假如第二个参数为 True,仅返回连接到数据库的数据集。

 

procedure AddFunction(const FuncName: String; const Category: String = ''; const Description: String = '');
    加入使用者自定函数至报表的函数列表。

 

TfrxReport 元件拥有下列属性:

 

property EngineOptions: TfrxEngineOptions;
    与 FastReport引擎相关的属性集合。

 

property IniFile: String;
    储存 fastReport 环境变量设定的文档或注册码的名称。

 

property Preview: TfrxCustomPreview;
    连接到“TfrxPreview” 元件,完成的报表将显示在此元件上。假如此属性空白,报表将 显示于标准的预览窗口。

 

property PreviewOptions: TfrxPreviewOptions;
    与报表预览相关的属性。

 

property PrintOptions: TfrxPrintOptions;
    与报表打印相关的属性。

 

property ReportOptions: TfrxReportOptions;
    定义报表相关的属性。

 

property ScriptLanguage: String;
    报表使用的脚本语言 (Script la nguage)。

 

property ScriptText: TStrings;
    脚本语言的内容。

 

property AllObjects: TList readonly;
    报表内所有的物件列表(包括页定义元件)。

 

property DataSets: TfrxReportDataSets readonly;
    报表可用的数据集列表。

 

property Designer: TfrxCustomDesigner readonly;
    连结到报表设计元件

 

property Engine: TfrxCustomEngine readonly;
  连结报表引擎。对于要使用程序码处理报表是非常有用的,它可以自定义报表处理引擎。

 

property Errors: TStrings readonly;
   错误清单,发生在一个或其它的进程。

 

property FileName: String;
    定义报表的文件名称;文件名会显示在设计环境的窗口标题中。

 

property PreviewPages: TfrxCustomPreviewPages readonly;
    定义一个连结到已完成的报表页面。它可被使用在所有地方,例如打印、存盘及导出等。

 

property Pages[Index: Integer]: TfrxPage readonly;
    报表页面列表,其中对话框类型也包括在列表中。

 

property PagesCount: Integer readonly;
  报表的页数。

 

property Script: TfsScript readonly;
  连结报表的“TfsScript” 元件,经由该连接,你可以为你的报表脚本语言加入变量、类型、函数以供以后调用。

 

property Style: TfrxStyle;
    报表式样。

 

property Variables: TfrxVariables readonly;
    报表变量列表。

 

FastReport 引擎的相关属性集合:
TfrxEngineOptions = class(TPersistent)
published
property ConvertNulls: Boolean default True;
转换数据库字段的 值至 或空字串 依字段型态而定 。
“Null” “0”, “False” ( )

property DoublePass: Boolean default False;
使报表进行二次处理,第一次进行资料搜集 例如报表总页数 ,第二次才实际进行报
( )
表处理。

property MaxMemSize: Integer default 10;
配置报表页面缓存(Cache)的最大内存使用量(Mbytes),当“UseFileCashe”属
性等于“True” 时特别有用。假如在建立期间耗用太多内存,已建立的报表缓存页面
将会被写入缓存文件,此属性并不非常的精确,它只大約的決定内存的限制。

property PrintIfEmpty: Boolean default True;
定义是否要打印空白报表(没有打印资料的报表)。

property TempDir: String;
指定保存临时文件的目录。

property UseFileCache: Boolean default False;
定义产生的预览报表是否缓存 到文件。 见 属性
(Cache) ( “MaxMemSize” )
end;

报表预览的相关属性集合:

TfrxPreviewOptions = class(TPersistent)
published
property AllowEdit: Boolean default True;
允许或不允许编辑预览窗口中的报表。

property Buttons: TfrxPreviewButtons;
预览窗口中的可用按钮集合。

TfrxPreviewButtons = setof TfrxPreviewButton; TfrxPreviewButton
= (pbPrint, pbLoad, pbSave, pbExport, pbZoom, pbFind, pbOutline,
pbPageSetup, pbTools, pbEdit, pbNavigator);
此属性可用的值如下:
pbPrint - 打印
pbLoad - 载入文件
pbSave - 存报表到文件
pbExport - 导出
pbZoom - 显示比例
pbFind - 搜寻
pbOutline - 选定报表边框
pbPageSetup - 页面设定
pbTools - 工具
pbEdit - 编辑
pbNavigator - 导航

上面的值你可以混合使用。

property DoubleBuffered: Boolean default True;
预览窗口采用双缓存区模式。假如启用 预置值 ,画面输出时屏幕不会有闪烁的情形,
( )
但处理速度会稍微下降。

property Maximized: Boolean default True;
定义预览窗口是否最大化。

property MDIChild: Boolean default False;
定义预览窗口是否为MDIChild (给MDI 介面使用)。

property Modal: Boolean default True;
定义预览窗口是否为Modal模示。

property OutlineVisible: Boolean default False;
定义是否显示报表的大纲。

property OutlineWidth: Integer default 120;
定义报表大纲显示的宽度。

property ShowCaptions: Boolean default False;
定义是否显示按钮的标题。当启动该属性时,你应该限制Buttons 属性所显示按钮
的个数,因为所有的按钮无法显示于同一画面。

property Zoom: Extended;
预置的显示百分比率。

property ZoomMode: TfrxZoomMode default zmDefault;
预置显示模式。可用的值如下:

zmDefault - 显示百分比率视“Zoom” 属性而定
zmWholePage - 整页模示
zmPageWidth - 页宽
zmManyPages - 两页
end;

报表打印相关属性的集合:

TfrxPrintOptions = class(TPersistent)
published
property Copies: Integer default 1;
预置的打印份数。
property Collate: Boolean default True;
不管校对份数。
property PageNumbers: String;
打印的页码。例如,“1,3,5-12,17-“ 。
property Printer: String;
打印机名称。
property PrintPages: TfrxPrintPages default ppAll;
定义要打印的方式。可用的值如下:
ppAll – 全部
ppOdd – 奇数页
ppEven – 偶数页
property ShowDialog: Boolean default True;
是否显示打印窗口。
end;

报表相关属性的集合:

TfrxReportOptions = class(TPersistent)
published
property Author: String;
报表作者。
property CreateDate: TDateTime;
报表建立日期。
property Description: TStrings;
报表描述。
property Name: String;
报表名称。
property LastChange: TDateTime;
报表最后修改日期。
property Password: String;
报表密码。假如该属性为空白,当打开报表定义档时需要输入密码。
property Picture: TPicture;
报表图片。
property SilentMode: Boolean default False;
无声 (Silent)方式。所有的错误信息将被保存在“TfrxReport.Errors”属
性,而不会在屏幕上显示任何信息。

property VersionBuild: String;
property VersionMajor: String;
property VersionMinor: String;
property VersionRelease: String;
决定报表版本的属性。
end;

下列的事件定义于 TfrxReport 元件:2
property OnAfterPrint: TfrxAfterPrintEvent;
发生在处理完每个报表物件之后(打印后)。

property OnBeforePrint: TfrxBeforePrintEvent;
发生在处理完每个报表物件之前(打印前)。

property OnClickObject: TfrxClickObjectEvent;
当预览一份报表时,选取报表内的物件时触发该事件。
property OnGetValue: TfrxGetValueEvent;
当启动一份报表,发现未定义的变量时,该事件必须返回变量的值。

property OnManualBuild: TfrxManualBuildEvent;
当开始打印报表,假如此事件被启动,然后FastReport的引擎将被阻断(不处理),
报表处理方法将交由程序员所写的程序处理。

property OnMouseOverObject: TfrxMouseOverObjectEvent;
当报表处于浏览窗口,且鼠标指针移到该物件上时触发此事件。

property OnUserFunction: TfrxUserFunctionEvent;
当执行报表的过程中,当调用的函数不存在,请使用“AddFunction”方法提供自
定义函数。

TfrxDBDataset

TfrxUserDataset

数据存取元件。FastReport使用这些元件读取及参考数据库的字段,这两个
元件都源于 “TfrxDataSet” 并继承其大部分的功能。

TfrxUserDataSet元件允许构建未连接到数据库的报表,而由其它来源接收
数(据如:数列、文件等)。在此同时,程序员仅需提供浏览此数据集的功能,资料
接收并非由此元件执行,而是用其它的方法(例如,经由
“TfrxReport.OnGetValue”事件)。

TfrxUserDataSet 元件有下列的属性:

property RecNo: Integer readonly;
目前记录编号,首笔的记录编号是“ ”
0

property Enabled: Boolean default True;
定义此元件是否可在designer里面使用。

property RangeBegin: TfrxRangeBegin default rbFirst;
数据导航(navigation)的起点。下列的值可以使用:
rbFirst – 从数据的第一笔记录开始。
rbCurrent – 从当前的记录开始。
property RangeEnd: TfrxRangeEnd default reLast;
数据导航(navigation)的起点。下列的值可以使用:
reLast – 直到数据结束。
ReCurrent – 直到目前的记录。
reCount – 依“RangeEndCount” 属性而定。

property RangeEndCount: Integer;
数据集中的数据个数,此功能只在“RangeEnd”属性等于 reCount 有效。
property UserName: String;
符号名称。在报表设计环境(Designer)下,将被显示于DataSet 的下方。

property OnCheckEOF: TfrxCheckEOFEvent;
TfrxCheckEOFEvent=procedure(Sender:TObject;varEof:Boolean)
of object; 此事件在数据集的尾端时,Eof参数将返回 True。

property OnFirst: TNotifyEvent;
数据集移至第一笔的位置时,会触发此事件。

property OnNext: TNotifyEvent;
数据集移至下一笔的位置时,会触发此事件。

property OnPrior: TNotifyEvent;
数据集移至上一笔的位置时,会触发此事件。

TfrxDBDataSet 元件用来连接以 TDataSet, TTable 及 TQuery 为基类的数
据库元件,有关数据的导航及字段的参考都是自动的,程序员不需特殊的设定。除
上述属性外,该元件有下列的属性:

property CloseDataSource: Boolean default False;
报表创建完成后,关闭数据库。
property OpenDataSource: Boolean default True;
在报表创建之前打开数据库。
property FieldAliases: TStrings;
数据集字段的符号名称 别名 。
( )
property DataSet: TDataSet; property DataSource:
TDataSource;
连结至 TDataSet 或 TDataSource 类型的元件。
property OnClose: TNotifyEvent;
当关闭数据集时触发此事件。
property OnOpen: TNotifyEvent;
当打开数据集时触发此事件

TfrxDesigner
TfrxDesigner 元件是报表设计器,当使用此元件,你的工程文件就可以使
用报表设计器,此元件它只包含一些报表设计器的设定,当加入”frxDesign” 单
元到uses 清单中,就表明与报表设计器连接上了。
此元件包含下列的属性:

property CloseQuery: Boolean default True;
定义结束设计报表是否询问储存报表之用。
property OpenDir: String;
打开报表的预置数据目录。

property SaveDir: String;
储存报表的预置数据目录。

property Restrictions: TfrxDesignerRestrictions;
报表设计环境下,限制不同的报表操作标识 (flag),此标识包含单一或混合数据
值:
drDontInsertObject – 禁止插入物件
drDontDeletePage – 禁止刪除页面
drDontCreatePage – 禁止建立新的页面
drDontChangePageOptions – 禁止修改页面属性
drDontCreateReport – 禁止建立新报表
drDontLoadReport – 禁止载入报表
drDontSaveReport – 禁止储存报表
drDontPreviewReport – 禁止预览报表
drDontEditVariables – 禁止编辑变量
drDontChangeReportOptions – 禁止修改报表属性

property OnLoadReport: TfrxLoadReportEvent;
TfrxLoadReportEvent = function(Report: TfrxReport): Boolean of
object;
此事件发生在载入报表之时。利用此事件,你可以从数据库载入报表。

property OnSaveReport: TfrxSaveReportEvent;
TfrxSaveReportEvent = function(Report: TfrxReport;
SaveAs:Boolean): Boolean of object;
此事件发生在储存报表之时。利用此事件,你可以将报表储存于数据库中。
property OnShow: TNotifyEvent;
此事件发生在启动报表设计环境时。

TfrxPreview
此元件专供建立自定义报表合预览窗口使用。

procedure AddPage;
加入空白页面到报表末端。

procedure DeletePage;
删除当前页。

procedure Print;
打印报表。

procedure LoadFromFile;
显示文件载入窗口。

procedure LoadFromFile(FileName: String);
载入指定的文件。

procedure SaveToFile;
显示文件储存窗口。

procedure SaveToFile(FileName: String);
储存文件到指定的文件名称。

procedure Edit;
载入当前页至设计模式供编辑使用。

procedure Export(Filter: TfrxCustomExportFilter);
使用指定的导出过滤器导出报表。

procedure First;
第一页。

procedure Next;
下一页。

procedure Prior;
上一页。

procedure Last;
最后一页。
procedure PageSetupDlg;
显示页面设定窗口。

procedure Find;
显示文字搜寻窗口。

procedure FindNext;
继续找下一个。

procedure Cancel;
取消创建报表。

procedure Clear;
清除报表。

你可以使用下列属性:
property PageCount: Integer readonly;
报表页数。

property PageNo: Integer;
目前报表页码 起始值为 。要移至其它页面,指定此属性的值即可。
( 1)

property Tool: TfrxPreviewTool;
选取工具。

property Zoom: Extended;
显示比例,“1” 代表 100% 。

property ZoomMode: TfrxZoomMode;
显示模式,可以的显示模式如下:
zmDefault – 预置值,显示比例根据“Zoom” 属性而定
zmWholePage – 整页模式
zmPageWidth – 与页面宽度相同
zmManyPages – 一屏显示多页

property OutlineVisible: Boolean;
是否显示报表大纲 树状结构 。

 

 

******在Delphi程序中访问报表对象
最基本的方法就是frxReport1.FindObject。然后把返回的对象强制转换成它的类型,当然,在报表中必须真的有这么个东东。如改变一个Tfrxmemoview的内容,可以这样写TfrxMemoView(frxReport1.FindObject('memo1')).Text:='jade';

还可以用TfrxReportPage的FindBand方法,这个方法的参数是Band类,如报表抬头就可以直接使用这个方法,因为抬头一个页中只有一个,如果有多个同样的类。则不能使用这种方法。如果要使用TfrxreportPage,一般可以用这样的代码
TfrxReportPage(frxReport1.Pages[0])。当然,如果你的这个页是对话框型的,则不行了。但一般都是报表型的。

******使用上下标
在Fastreport中使用上下标是很简单的,只要用一个Tfrxmemoview,把AllowHTMLTags属性设为真,就可以使用网页标签来实现上下标了,如12<sup>2</sup>与24<sub>3</sub>。就分别是2为上标,3为下标。

******打印页码
打印页码是很简单的,只要加入一些常量即可,如打印第几页共几页就可以使用
   第[Page#]页    共[TotalPages#]页  
这里要注意的一点是如果想正确显示总页数,必须选中二次报表。


******动态建立变量及变量组
建立变量组名
frxreport1.Variables.Add.Name:=' '+变量组名;
建立变量名
frxreport1.Variables.AddVariable('组名,如果为不存的组或空,则为默认组,这里不需要空格',变量名,变量初始值);
例如要建立变量组Yuan,二个变量Yuan1,Yuan2,则为
frxreport1.Variables.Add.Name:=' Yuan';注意前面是空格
frxreport1.Variables.AddVariable('Yuan',Yuan1,初始值)
frxreport1.Variables.AddVariable('Yuan',Yuan2,初始值)

******共用TFrxreport及TfrxDBDataSet
一个程序中,不管多么大的程序,只要打印或预览时是模式的,则完全可以共用一个TFrxreport变量及几个TfrxDBDataSet。只不过,要注意完成一个报表程序的步骤,主要是下面几步
1)清除报表,得到一个全新的报表内容。
Frxreport1.clear。
2)设置要使用的TfrxDBDataSet的别名,如果不需要可以省略这一步,但一般最好不同的报表用不同的别名。
注意这一步要在加载报表文件之前,因为一般设计报表文件时已经包含了别名信息。
frxDBDataSet1.UserName:=别名;
3)加载报表或动态建立一个TfrxReportPage。
Frxreport1.LoadFromFile(报表文件的完整文件名);
4)关联TfrxDBDataSet与TDataset,并设置要使用哪些TfrxDBDataSet。
Frxreport1.DataSets.Clear;//先清除原来的数据集
frxDBDataSet1.DataSet:=dataset1;//关联Fastreport的组件与TDataset数据集。
Frxreport1.DataSets.Add(frxDBDataSet1);//加载关联好的TfrxDBDataSet到报表中。
经过这几步后,就可以像单独使用一个Tfrxreport一样使用共用的报表组件了。

******加入自定义函数
Fastreport可以自己加入需要的函数,来实现特定的功能。过程就是:
1)添加函数到报表中。
frxreport1.AddFunction('完整的函数声明');
如有一个自定义函数,为GetName(Old:String):String;这个函数通过数据集的一个字段,得到另一个返回值。
则语句为:frxreport1.AddFunction('Function GetName(Old:String):String;');
2)脚本中使用函数。
在脚本中或报表中使用自定义函数,就像使用其它Fastreport内置函数一样。
3)程序中处理函数。
使用函数是通过frxreport1的OnUserFunction函数来实现的。
OnUserFunction的声明如下:Function(const MethodName: String;var Params: Variant): Variant;
比如上面的函数,首先要有一个函数,这个函数是GetName的实现部分。如有一个在程序中实现的函数。
function RealGetName(Old:String):String;这个函数名是无所谓的,也可以是GetName。
在OnUserFunction的事件处理中有如下代码即可完成自定义函数在报表中的使用。
if CompareText(MethodName,'GetName')=0 then Result:=RealGetName(VarToStr(Params[0]));
我一般都是使用CompareText来比较函数名,因为我发现二个版本的Fastreport,一个是MethodName全部自动变成了小写,一个是全部自动变成了大写,所以干脆用CompareText来比较,肯定不会出错。

如果有多个参数,则依次传递Params[0],Params[1]即可,要保持顺序一致。
这里要注意一点,如果参数为指针,则不能直接使用Pointer(Integer(Params[0]))。因为实际传递过来的是指针的整数值,可以使用Pointer(StrToInt(VarToStr(Params[0])))。

******使用脚本,脚本中使用变量
很多时候,我们希望把对报表的控制放到报表的脚本中,通常我这样做有二个原因:
1)能够根据字段内容的变化而使用不同的设置,因为如果想在程序中实现这样功能,就不得不用自定义函数,函数的实现要放到程序中,函数可能需要传递很多参数,效率低下。
2)把不同报表的控制放到脚本中,可以实现报表的模块化,程序只是简单的设置数据集的关系,并加载硬盘上的报表文件,不同报表的不同实现方式,显示方式,均放到报表文件中,程序简洁,易维护,易升级。
当然,这样的缺点就是程序中加载报表时的数据集别名必须与设计报表时的别名一致。
脚本的使用与通常程序的使用并没有太多的区别,就是像正常的程序那样引用控件的名称即可。
但注意对变量的使用,需要把变量名或表达式用<>括起来。

******在脚本中根据字段名改变Tfrxmemoview的内容
假设有数据表“用户”,字段ID为用户标识,Name为用户名,打印时要求,如果用户名为空,则打印“无用户名”,否则打印出“用户名:实际的用户”,则可以在ID的Tfrxmemoview控件的OnAfterData事件中写如下脚本。
if <frxDBDataSet1."Name">='' then
   Memo2.Text:='无用户名'
else
   Memo2.Text:='用户名:[frxDBDataSet1."Name"]'
Memo2是放置用户名称数据的Tfrxmemoview控件。
这里注意,要在脚本中访问变量需要把变量用<>包括起来。

******实现连续打印
很多人认为Fr不能实现连续打印,以为只能通过自己写函数调用打印函数来实现连续打印,实际上,Fr可以轻易的实现连续打印,同时,实现时又是非常简单,你甚至可以在你的程序的打印设置中简单的让客户选择是否连续打印,其它都可以保持不变。

function PelsTomm(Pels:Extended):Extended;
begin       
   Result:=Pels/Screen.PixelsPerInch*25.4;
end;

procedure PrintSerial(Frx:TFrxReport;SequencePage:Byte=0);
var
   P:TfrxReportPage;
   R,R1:Extended;
begin
   {必须是二遍报表,否则无法计算总页数。
   下面的方法只适用于没有页脚的情况,因为如果有页脚的话
   FreeSpace就始终为0了。可以用报表脚来代替。
   因为是连续打印,也可以看作只有一页,报表脚也就相当于页脚了}
   if not Frx.Engine.DoublePass then Exit;
//SequencePage指要连续打印的页面,普通报表就是0
   P:=TfrxReportPage(Frx.Pages[SequencePage]);
   R1:=P.TopMargin+P.BottomMargin;
   while Frx.PrepareReport do
   begin
     if (Frx.Engine.TotalPages<=1) then Break;
     R:=Pelstomm(Frx.Engine.TotalPages*Frx.Engine.PageHeight-
       Frx.Engine.FreeSpace)+R1;
     P:=TfrxReportPage(Frx.Pages[SequencePage]);
     P.PaperHeight:=R;
   end;
   {必须用上面的循环代码来得到准确的空白区域
   不能用通过计算总页数减去各页的页边距的方法来获得空白区域
   因为如果碰到一条记录过宽的情况导致换页,就不准确了。}
   R:=Pelstomm(Frx.Engine.TotalPages*Frx.Engine.PageHeight-
     Frx.Engine.FreeSpace)+R1;
   P:=TfrxReportPage(Frx.Pages[SequencePage]);
   P.PaperHeight:=R;
end;

在预览或打印前先调用PrintSerial即可。

 

 

 

问题描述,正如rainee所说:程序设计时Memo中的中文显示正常,预览也正常。程序运行时Memo中的中文只能显示前几个汉字,有时甚至不能显示。再次打开程序源码,会发现Memo中的中文没保存下来或保存不完全。如果用Memo显示字段或变量的值,其中的中文显示正常。
除 了文章提到的方法外,FastReport4.7.91的TfrxReport有StoreInDFM属性,将其设为false, 在运行时动态加载报表文件,语句如下frxrprtPrintCheck.LoadFromFile('a.fr3');然后预览打印都没有问题。

担心原文作者文章地址有变动,特转载如下:

FastReport3.15以上版本(包括最新的3.23.9)都存在一个问题:程序设计时Memo中的中文显示正常,预览也正常。程序运行时 Memo中的中文只能显示前几个汉字,有时甚至不能显示。再次打开程序源码,会发现Memo中的中文没保存下来或保存不完全。如果用Memo显示字段或变量的值,其中的中文显示正常。
    网上能找到的解决方法主要有两种:
一、在FastReport中添加变量,设置Memo的内容为变量的值,在报表的GetValue事件中给变量赋值。如果你的报表中有许多Memo的值相同,用这种方法最方便。
procedure TForm1.frxReport1GetValue(VarName: String; var Value: Variant);
begin
if CompareText(VarName, 'MyVar1') = 0 then
Value := 'Hello.';
end

二、设计时Memo内容为空,在Show报表前给Memo控件赋值。
procedure SetMemoData(aReport: TfrxReport; aMemoName, aString: string);
var
  mv: TfrxMemoView;
begin
  mv := aReport.FindObject(aMemoName) as TfrxMemoView;
  if mv<>nil then
    mv.Text := aString;
end;

    这里要讲的第三种方法是我最近发现的:
三、用FastReprot Studio3.20设计报表。
    FastReprot Studio3.20是独立的可直接联接数据库做报表的程序,用它做报表和在Delphi中操作完全一样,它的Memo中可设置中文内容,并且能正常显示,保存后也不会丢失。然后在Delphi中调用保存好的报表,这样Memo中的中文显示就没问题了。

/
这是在CSDN搜索到的,供参考

Fastreport3.x对中文的支持有问题.例如:frxMemoView中如果填了中文,那么StoreInDFM设时就会有问题.

中文显示不出来.

网上之前也流行了一些解决办法,如:用变量保存中文,运行时再赋值,又或者用另外的独立的设计器来设计报

表.但我觉得这些办法都不好,因为它改变了程序员的使用习惯.

其实问题出Fastreport3.x把widestrings属性持久化到DFM时.因为它会先把text转换成Utf8格式再保存.但

delphi本身对Utf8的支持又不太好,(我发现两个以上的Utf8格式字符串相加有时会出错),所以我把widestrings

这个类持久化函数改了一下去掉了Utf8的转换部份,就把问题切底解决了.

frxUnicodeUtils单元下:
把TWideStrings类的ReadDataW和WriteDataW函数中关于Utf8的转换去掉

具体是:

ReadDataW:
    //Add(Utf8Decode(Reader.ReadString));
    Add(Reader.ReadString);

WriteDataW:
    //Writer.WriteString(Utf8Encode(Get(I)));
    Writer.WriteString(Get(I));

 

 

 

 

TfrxDBDataset        TfrxUserDataset

数据存取元件。FastReport 使用这些元件读取及参考数据库的字段,这两个元件都源于 “TfrxDataSet” 并继承其大部分的功能。

TfrxUserDataSet 元件允许构建未连接到数据库的报表,而由其它来源接收数(据如:数列、文件等)。在此同时,程序员仅需提供浏览此数据集的功能,资料接收并非由此元件执行,而是用其它的方法(例如,经由“TfrxReport.OnGetValue”事件)。

TfrxUserDataSet 元件有下列的属性:

property RecNo: Integer readonly;目前记录编号,首笔的记录编号是“0

property Enabled: Boolean default True;定义此元件是否可在designer 里面使用。

property RangeBegin: TfrxRangeBegin default rbFirst;数据导航(navigation)的起点。下列的值可以使用:

rbFirst – 从数据的第一笔记录开始。rbCurrent – 从当前的记录开始

property RangeEnd: TfrxRangeEnd default reLast;数据导航(navigation)的起点。下列的值可以使用:

reLast – 直到数据结束。ReCurrent – 直到目前的记录。reCount – “RangeEndCount” 属性而定。

property RangeEndCount: Integer;数据集中的数据个数,此功能只在“RangeEnd”属性等于reCount 有效。

property UserName: String;符号名称。在报表设计环境(Designer)下,将被显示于DataSet 的下方。

property OnCheckEOF: TfrxCheckEOFEvent;

TfrxCheckEOFEvent = procedure(Sender: TObject; var Eof: Boolean)of object; 此事件在数据集的尾端时,Eof 参数将返回True

property OnFirst: TNotifyEvent;数据集移至第一笔的位置时,会触发此事件。

property OnNext: TNotifyEvent;数据集移至下一笔的位置时,会触发此事件。

property OnPrior: TNotifyEvent;数据集移至上一笔的位置时,会触发此事件。

TfrxDBDataSet 元件用来连接以TDataSet, TTable TQuery 为基类的数据库元件,有关数据的导航及字段的参考都是自动的,程序员不需特殊的设定。除上述属性外,该元件有下列的属性:

property CloseDataSource: Boolean default False;报表创建完成后,关闭数据库。

property OpenDataSource: Boolean default True;在报表创建之前打开数据库。

property FieldAliases: TStrings;数据集字段的符号名称(别名)

property DataSet: TDataSet; property DataSource:

TDataSource;连结至TDataSet TDataSource 类型的元件。

property OnClose: TNotifyEvent;当关闭数据集时触发此事件。

property OnOpen: TNotifyEvent;当打开数据集时触发此事件

TfrxDesigner

TfrxDesigner 元件是报表设计器,当使用此元件,你的工程文件就可以使用报表设计器,此元件它只包含一些报表设计器的设定,当加入”frxDesign” 单元到uses 清单中,就表明与报表设计器连接上了。此元件包含下列的属性:

property CloseQuery: Boolean default True;定义结束设计报表是否询问储存报表之用。

property OpenDir: String;打开报表的预置数据目录property SaveDir: String;储存报表的预置数据目录。

property Restrictions: TfrxDesignerRestrictions;报表设计环境下,限制不同的报表操作标识(flag),此标识包含单一或混合数据值:

drDontInsertObject – 禁止插入物件drDontDeletePage – 禁止刪除页面drDontCreatePage – 禁止建立新的页面

drDontChangePageOptions – 禁止修改页面属性drDontCreateReport – 禁止建立新报表

drDontLoadReport – 禁止载入报表drDontSaveReport – 禁止储存报表

drDontPreviewReport – 禁止预览报表drDontEditVariables – 禁止编辑变量

drDontChangeReportOptions – 禁止修改报表属性

property OnLoadReport: TfrxLoadReportEvent;

TfrxLoadReportEvent = function(Report: TfrxReport): Boolean of

object;

此事件发生在载入报表之时。利用此事件,你可以从数据库载入报表。

property OnSaveReport: TfrxSaveReportEvent;

TfrxSaveReportEvent = function(Report: TfrxReport;SaveAs:Boolean): Boolean of object;

此事件发生在储存报表之时。利用此事件,你可以将报表储存于数据库中。

property OnShow: TNotifyEvent;此事件发生在启动报表设计环境时。

TfrxPreview

此元件专供建立自定义报表合预览窗口使用。procedure AddPage;加入空白页面到报表末端。

procedure DeletePage;删除当前页。procedure Print;打印报表。procedure LoadFromFile;显示文件载入窗口。procedure LoadFromFile(FileName: String);载入指定的文件。procedure SaveToFile;显示文件储存窗口。procedure SaveToFile(FileName: String);储存文件到指定的文件名称procedure Edit;载入当前页至设计模式供编辑使用。

procedure Export(Filter: TfrxCustomExportFilter);使用指定的导出过滤器导出报表。

procedure First;第一页。procedure Next;下一页。procedure Prior;上一页procedure Last;最后一页。

procedure PageSetupDlg;显示页面设定窗口。procedure Find;显示文字搜寻窗口。procedure FindNext;继续找下一个。procedure Cancel;取消创建报表。procedure Clear;清除报表。

你可以使用下列属性:

property PageCount: Integer readonly;报表页数。

property PageNo: Integer;目前报表页码(起始值为1)。要移至其它页面,指定此属性的值即可。

property Tool: TfrxPreviewTool;选取工具。property Zoom: Extended;显示比例,“1” 代表100%

property ZoomMode: TfrxZoomMode;显示模式,可以的显示模式如下:zmDefault – 预置值,显示比例根据“Zoom” 属性而定zmWholePage – 整页模式zmPageWidth – 与页面宽度相同

zmManyPages – 一屏显示多页property OutlineVisible: Boolean;是否显示报表大纲(树状结构)

property OnPageChanged: TfrxPageChangedEvent;目前页面要改变时,此事件将被触发。

TfrxBarcodeObject  TfrxOLEObject   TfrxChartObjectTfrxRichObject

TfrxCrossObject    TfrxCheckBoxObject     TfrxGradientObject

可在报表内部使用的物件,这些元件自己没做任何事情,它们会自动将元件的单元加入uses 清单,加入你打算打开一份报表,此功能会自动被加入报表,未包括此物件至工程文件的话,打开报表时将会发生错误。

TfrxDialogContols

附加项(add-in) 物件的集合,可用于报表内的对话窗口,它包含下列元件:button,edit box, list box 等。此元件自己不会执行任何事,加入此元件“frxDCtrl”将会自动加入“Uses”清单。

TfrxBDEComponents

BDE 数据库元件,数据库界面采用BDE(Borland Database Engine)时,工程文件必须加入此元件。

TfrxADOComponents

ADO 数据库元件,数据库连接采用ADO(Advance Data Object)时,工程文件必须加入此元件。

TfrxIBXComponents

Interbase 数据库元件,数据库采用IBX 连接Interbase 后台数据库时,工程文件必须加入此元件。上述数据库元件,可被使用在报表的对话窗口上,它包括下列的元件: “Database”,“Table” “Query” 。这些元件本身并不做任何事;它们只会将元件隶属的单元自动加入uses 清单中。

Working with TfrxReport component

Loading and saving a report 存取报表

报表定义表格与工程文件的表格储存在同一个文件(.DFM),在大部分的情況下,并不需要额外的操作步骤,因此载入报表便相当简单。假如你要将报表储存在文件或数据库的BLOB 字段,你必须使用“TfrxReport”提供的方法来载入及储存报表。

function LoadFromFile(const FileName: String;

ExceptionIfNotFound: Boolean = False): Boolean;

载入指定的报表,假如第二个参数的值等于”True ” 且指定的文件不存在,然后它会产生一个例外。假如文件载入成功,它返回“True”

procedure LoadFromStream(Stream: TStream);从数据流(stream)载入报表。

procedure SaveToFile(const FileName: String);储存报表至指定的文件名。

procedure SaveToStream(Stream: TStream);储存报表至数据流(stream)

报表预置的后缀名称为“FR3”。范例:

frxReport1.LoadFromFile('c:/1.fr3');

frxReport1.SaveToFile('c:/2.fr3');

Designing a report 设计报表

通过“TfrxReport.DesignReport”方法调用报表设计器(reportdesigner),要具有设计报表的功能,你必须在工程文件中加入“TfrxDesigner”元件,或在uses 加入“frxDesgn”单元。范例:frxReport1.DesignReport;

Running a report 执行报表

应用下列两个“TfrxReport”元件的方法启动报表:procedure ShowReport(ClearLastReport: Boolean = True);

启动报表并显示结果在浏览窗口。假如“ClearLastReport”参数等于“False”,然后报表将会清前一份报表的末端,否则前一份报表的内容将会被清除ど柚。function PrepareReport(ClearLastReport: Boolean = True):Boolean;

启动报表,但不开启预览窗口,参数用法同“ShowReport”方法,假如报表建立成功,它返回“True”。在大部分的情況下,采用第一种方法比较方便,当报表建立的过程中,它会立刻显示预览窗口。当我们要把报表加入上一份报表的后面时,“ClearLastReport”

数是非常方便的技巧在批次报表打印时特别有效)。范例:frxReport1.ShowReport;

Previewing a report 预览报表

在报表预览窗口显示报表有两种方式:不管是调用“TfrxReport.ShowReport”方法(前面已提及)或使用“TfrxReport.ShowPreparedReport”方法。在第二种状况,报表创建的过程不会执行,但是报表的结果会显示于屏幕。这个意思是说,你应该使用“PrepareReport”方法创建报表或载入先前已经建立的报表。范例:

if frxReport1.PrepareReport then

frxReport1.ShowPreparedReport;

在这个案例中,报表创建完成在先,然后显示报表于浏览窗口。创建大型的报表可能耗费许多时间,那也是为什么使用“ShowReport”方法会比“PrepareReport/ShowPreparedReport” 来的好的原因,我们指定“TfrxReport.PreviewOptions” 属性,指定预览的参数。

Printing a report 打印报表

在大部份的情況,你会从预览窗口打印报表。要手动打印报表,你应该使用“TfrxReport.Print”方法,例如:frxReport1.Print;

在此同时,你可以设定打印对话窗口的参数。你可以从“TfrxReport.PrintOptions”属性指定打印的预置值及取消显示打印窗口。

Loading and saving a finished report 存取已完成的报表

它可以从预览窗口执行,这也可以手动的用“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”方法来执行。

Exporting a report 导出报表

它可从预览窗口执行,此项功能也可以用“TfrxReport.Export”方法来执行,在此方法的参数中,你必须指定要使用的导出过滤元件:如:frxReport1.Export(frxHTMLExport1);导出过滤元件必须是可用的(你必须将它放入工程文件的表单上)且设定正确。

Creating a custom preview window 建立自定义预览窗口

FastReport 显示报表于标准的预览窗口。假如为了某种理由它无法满足你,你可以使用自定义的预览窗口。为此,FastReport “TfrxPreview” 元件于是诞生了,要显示报表这个元件必须连接到“TfrxReport.Preview”属性。

Building a composite report (batch printing) 建立复合报表(批量打引)

在某些情况下,我们必须一次打印数份报表,或封装及实现多份报表于同一个预览窗口。要执行这项工作,在FastReport 中有多个工具,允许建立一份新的报表,置于另一份已存在的报表末端,«TfrxReport.PrepareReport»方法有此«ClearLastReport», «True»,此参数定义是否清除前一份已建立的报表。下列的程序码示范如何从两个报表定义文件,批次建立一份报表:

frxReport1.LoadFromFile('1.fr3');

frxReport1.PrepareReport;

frxReport1.LoadFromFile('2.fr3');

frxReport1.PrepareReport(False);

frxReport1.ShowPreparedReport;

我们载入第一个报表并在后台处理报表(不显示),然后我们载入第二份报表到同一«TfrxReport»物件,并置参数 «ClearLastReport» 的值为假(False)建立报表。此功能允许第二份报表的结果接在第一份报表的后面。最后,我们将两份报表显示在同一个预览窗口中。

Numbering of pages in a composite report 复合报表中的页数

你可以使用 «Page», «Page#», «TotalPages» «TotalPages#» 系统变量显示页码或总页数。在复合式报表,这些变量代表的意义如下:Page -目前报表的页码Page# -批次报表的页码TotalPages -目前报表的总页数(报表必须设定为two-pass)TotalPages# -批次报表的总页数

Combination of pages in a composite report 复合报表的合并页

如上所述,当打印时,报表设计的属性 «PrintOnPreviousPage»可以利用前一页的可用空间打印下一页的内容。在复合报表中,它允许你在前一份报表最后一页的可用空间上建立一份新的报表,要执行此功能,必须在每一份连续报表的第一个设计页面启动属性«PrintOnPreviousPage»

Interactive reports 交互式报表

在交互式报表中,我们可以在预览窗口定义任何报表物件对鼠标按下的反应。例如,使用者选择数据列,然后做一份新的报表,显示选取列的明细数据。任何报表都可以成为交互式报表,要执行此操作,你只需建立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» 方法重新建立报表。在此范例中,点选 «Memo1» 物件将显示此物件的內容,当点选«Memo2,»将显示Dialog 窗口,物件的内容可于此窗口内被修改。设定«Modified» 标识为«True» 允許保留及显示修改后的內容。同样的方法,它也可被定义为一个单击,有不同的反映。例如,执行一个新的报表。下列的注释是必要的。在中,在一个预览窗口仅显示一个报告,由一个元件组成(不像FastReport 2.x 版)。这就是运行一个报告,其它 TfrxReport 物件,必须删除的原因。

要给使用者按下物件一个提示,我们可以在鼠标指针移至物件上方时变更鼠标指针显示。要达到此目的,请在报表设计环境下,选取想要的物件,并设定不同于预置的Cursor 属性即可。可单击(clickable)物件有许多详细的定义规则。在简单的报表中,可以随意定义目录(contents)中物件的名称。可是,在复杂报表的报表中却不行。 例如,创建逐条的报表在有序的数据中。一个用户单击目录为“12”的«Memo1»物件。在该物件上数据将怎样排序?这就是你该明确知道主键值排列顺序的原因。FastReport 可分配一个包含任何数据(我们的例子中是主键值的数据)的字符串到任何报表的物件。此字符串储存在 «TagStr» 属性中。让我们以FastReport 的范例(FastReportDemo.exe 内的【Simple list)来说明,这是一家公司的客户明细,打印的內容包括【client’s name】,【address】 【contact person】 等字段,数据来源是DBDEMOS 演示数据库的“Customer.db”数据表,该数据表有一个主键值【CustNo】字段,它并未输出在报表。我们的工作是决定点下的物件是哪一笔记录,然后取得该记录的主键值。要执行该工作,必须在Master Data 区域所有物件的«TagStr» 属性在报表建立期间, «TagStr» 属性的內容会以相同的方法被重新计算,当字符物件的內容被计算,所有用到此变量的值将会被取代。假如主鍵值(Primary Key) 是复合字段(它包含多个字段)«TagStr» 属性的內容可以是下列的写法:[Table1."Field1"];[Table1."Field2"]

建立报表后, «TagStr» 属性的值包含'1000;1' , 这样就不难取得键值。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值