这篇文章给大家聊聊关于fastreport控件,以及FastReport的使用方法对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。
这是FastReport的主控件。它包含了调入、保存、预览和打印报表的方法。每个TfrReport控件只能包含一个单独报表。
TfrReport属性描述DataSet-联接到一个TfrxxxDataSet。这个数据源的记录数定义需多少时间这个报表才能被构建和打印。(参考:ReportType属性)GrayedButtonsFalse如果为True,设计器和预览窗口的工具栏将显示为灰色。InitialZoompzDefault定义预览的初始缩放值。MDIPreviewFalse显示预览窗口为一个MDI子窗口。ModalPreviewTrue如果为True,预览窗口为模式方式。ModifyPreparedTrue如果为True,在预览窗口中双击页面则可以修改准备好的报表。Preview-连接到一个TfrPreview。如果这个属性被设置,准备好的报表将被显示在这个控件中。PreviewButtonsAll定义在预览窗口中可用的按钮集。ReportTypeRtSimpleDefineshowtointerpretthedatasourceconnectedtotheDataSetproperty.IfReportType=rtMultiple,thereportwillbebuiltasmanytimesasthenumberofrecordsintheconnecteddatasource.Thisisusefulforprintingareportmultipletimesbasedonalist(i.e.thedatasource).
定义怎样解释数据源连接到DataSet属性。如果ReportType=rtMultiple,报表将在不同时间构建连接数据源的记录数。ShowProgressTrue如果为True,当准备、打印或输出报表时显示过度窗口。StoreInDFMFalse如果为True,存贮报表在DFM文件中。注意:报表存入DFM文件后存贮在可执行文件(EXE)中而不能被修改。Title-报表标题。这个名称显示在预览窗口和打印任务列表中。
注意:TfrReport.StoreInDFM属性缺省为False。意思是你的报表必须存入一个可执行文件或转换到数据库的BLOB或二进制字段中。如果你想保存你的报表到DFM资源(像在其它的报表工具中,例如QuickReport和ReportBuilder),设置这个属性为True。但必需记住——这将要求你在任何一个报表被修改时都必须重新编译你的应用程序。
事件描述OnBeforePrint这个事件在打印报表之前被激活。注意:FastReport对象不是控件,因此它们不能显示在在对象观察中。你不能指定各个对象的个别事件处理。不过,你可以使用公共事件处理,像OnBeforePrin,OnBeginBand和OnEndBand。OnBeginBand在打印一个区域前这个事件被激活。OnBeginColumn在打印透视表栏前这个事件被激活。OnBeginDoc在打印一个报表前这个事件被激活。OnBeginPage在开始打印一个页面时这个事件被激活。OnEndBand在打印一个区域结束后这个事件被激活。OnEndDoc在结束一个报表的打印时这个事件被激活。OnEndPage在结束一个页面的打印时这个事件被激活。OnGetValue当FastReport在表达式中查找不明变量时这个事件被激活。指定事件处理返回这个变量值。OnManualBuild指定这个事件的处理将允许你手工构建报表。(例如用代码显示一个需要的区域)。参考演示:DEMOS\\MANUAL。OnMouseOverObject在预览窗口中当鼠标在任何时间移到某个对象时这个事件被激活。事件句柄将返回这个对象的光标类型(例如“pointinghand”光标)。这能让用户观察哪些对象可“点击”,哪些不能。OnObjectClick当你在预览窗口中点击某个对象时这个事件被激活。OnPrintColumn打印透视表栏前这个事件被激活。这个事件能够返回栏宽。OnProgress在长时间的运行中这个事件被激活。这个事件处理可以显示工作进度。OnUserFunction当FastReport在表达式中查找不名函数时这个事件被激活。这个事件处理将返回这个函数值。
我在报表中使用了这样一个Memo:
procedureTForm1.Button1Click(Sender:TObject);beginfrxReport1.LoadFromFile('Test.fr3');frxReport1.Variables['Test']:='hello';frxReport1.ShowReport();end;
结果发生异常。不能赋值。请问该怎么传递程序中的变量到报表里面?
在你的frReport控件的OnGetValue事件中加入以下代码:procedureTForm1.frReport1GetValue(constParName:string;varParValue:Variant);varTest:string;beginifParName='Test'thenparValue:='hello';end;然后,在你的报表上加入,这个变量,就可以了。
////////////////////////由于在统计汇总表里对一段时间进行查询的,现在需要把从起始时间到终止时间送到报表里去,应该如何送。如:起始时间:2005-05-01终止时间:2005-05-31,如何把这两个时间送到报表里去,谢谢!
假设报表中有一个memo,里面定义一个变量[mydate]Report.Dictionary.Variables.Variable['mydate']:=''''+edtsz.Text+'''';
////////////////////////////////:我怎样添加我的自定义函数?A:使用TfrReport.OnUserFunction事件.这里有一个简单的例子:
procedureTForm1.frReport1UserFunction(constName:String;p1,p2,p3:Variant;varval:Variant);beginifAnsiCompareText('SUMTOSTR',Name)=0thenval:=My_Convertion_Routine(frParser.Calc(p1));end;
然后,你就可以在报表(任何表达式或脚本)的任何地方使用SumToStr函数了。
Q:但是它仅仅能工作在一个TfrReport组件中。可我想在任何地方(在所有的TfrReport组件中)使用的我的自定义函数?A:使OnUserFunctionevent句柄作为所有组件的公用句柄。如果你不能做到这一点,你需要创建函数库:
typeTMyFunctionLibrary=class(TfrFunctionLibrary)publicconstructorCreate;override;procedureDoFunction(FNo:Integer;p1,p2,p3:Variant;varval:Variant);override;end;
constructorTMyFunctionLibrary.Create;begininheritedCreate;withListdobeginAdd('DATETOSTR');Add('SUMTOSTR');end;end;
procedureTMyFunctionLibrary.DoFunction(FNo:Integer;p1,p2,p3:Variant;varval:Variant);beginval:=0;caseFNoof0:val:=My_DateConvertion_Routine(frParser.Calc(p1));1:val:=My_SumConvertion_Routine(frParser.Calc(p1));end;end;
要注册函数库,调用frRegisterFunctionLibrary(TMyFunctionLibrary);要卸载函数库,调用frUnRegisterFunctionLibrary(TMyFunctionLibrary);
Q:我怎样将我的函数添加到函数列表中(用表达式生成器)?A:使用frAddFunctionDesc过程(在FR_Class单元中):
frAddFunctionDesc(FuncLib,'SUMTOSTR','Myfunctions','SUMTOSTR(<Number>)/Convertsnumbertoitsverbalpresentation.');
注意:"/"符号是必须的!它从它的描述中分隔函数语法。FuncLib被声明为你自己的函数库(如果你不使用函数库可以将其设置为nil).当函数库未注册时,所有它的函数将自动从函数列表中删除。
----------------使用变量-------------------------------------
Q:我怎样编程实现填充变量列表(在数据词典中)?
A:数据词典中的所有变量及分类都被存储在TfrReport.Dictionary.Variables中.
withfrReport1.Dictionarydobegin//创建分类(名称用空白)Variables['Newcategory']:='';//创建变量Variables['NewVariable']:='CustomerData.Customers."CustNo"';Variables['AnotherVariable']:='Page#';end;
withfrReport1.DictionarydoVariables['Month']:='March';
但是当我运行报表是,出现了错误,为什么?
A:因为FastReport假定数据词典中的字符串变量值是一个表达式,它需要分析、计算它。可以使用其它的方法:
withfrReport1.DictionarydoVariables['Month']:=''''+'March'+'''';
或者,使用frVariables来传输固定数据到报表。
Q:我不想在数据词典中显示某些数据集?
A:使用TfrReport.Dictionary.DisabledDatasets:
withfrReport1.Dictionarydobegin//关闭该数据集DisabledDatasets.Add('CustomerData.Bio');//或者,关闭整个数据模块/窗体DisabledDatasets.Add('CustomerData*');end;
A:有几个方法可以实现它.第一是使用全局对象frVariables(在FR_Class单元中被定义):
frVariables['Myvariable']:=10;
这段代码创建了一个名称为“Myvariable”,值为10的变量。这是最好的传输固定数据的报表的方法。
第二种方法是使用TfrReport.OnGetValue事件.这可以使用这个方法来传送动态数据、记录等。
procedureTForm1.frReport1GetValue(ParName:String;varParValue:Variant);beginifParName='MyField'thenParValue:=Table1MyField.Value;end;
最后,第三种方法是通过编程在数据词典中定义变量(可以参考以前的问题):
withfrReport1.DictionarydobeginVariables['MyVariable']:='CustomerData.Customers."CustNo"';Variables['AnotherVariable']:='10';end;
Q:我能在报表和程序间传送数据吗?A:使用frVariables对象.如果你在报表的任何对象的脚本中写入以下代码:
那么,在你的程序中,你可以使用以下代码来获取MyVariable的值:v:=frVariables['MyVariable'];
----------------脚本(FastReportPascal)---------------------------------
A:当然.选择band,然后按Ctrl+Enter或在对象浏览器中选择"OnBeforePrint"属性。
A:当然.选择页(在空白处单击),然后在对象浏览器中选择"OnBeforePrint"属性。如果该页是一个对话框窗体,那么这个属性就是"OnActivate".
Q:我有两个对象:Memo1和Memo2.我能否在Memo1的脚本中调用Memo2的属性和方法?
A:当然,例如,你可以这样做:对象名.属性名.
Q:在脚本中,我可以使用对象的哪些属性?
A:几乎所有你能在对象浏览器中看到的属性。例如,可以使用Font.Name,Font.Size等来存取字体属性。
----------------其它问题--------------------------------------------
Q:怎样改变多页报表中某一页的顺序?
Q:我想查看所有的字段及变量,我想在报表中使用列表来实现它?
A:设置TfrReport.MixVariablesAndDBFields:=True.现在,所有的数据字段及变量可在“插入数据字段”对话框中可存取了。
A:在导入组件(比如,TfrTextExport)中设置所有必需的选项,然后通过设置ShowDialog属性为False来关闭此对话框。
Q:为什么TotalPages变量不起作用?它总是返回0.
A:在你的报表中设置Two-pass选项.要设置它,你需要在报表设计器的“文件”菜单中,打开“报表选项”对话框。
Q:我用BLOB字段来存储我的报表。当我运行报表设计器时,它显示我的报表未命名?
frReport1.FileName:='Nameofmyreport';
Q:我想在重新定义报表设计器中的“打开”及“保存”按钮的功能?
A:查看TfrDesigner组件.它有几个必需的事件:OnLoadReport和OnSaveReport.这里有一小段代码例子:
procedureTForm1.frDesigner1LoadReport(Report:TfrReport;varReportName:String;varOpened:Boolean);beginwithMyOpenDialogdobeginOpened:=ShowModal=mrOk;ifOpenedthenbeginReport.LoadFromBlobField(...);ReportName:=...;end;end;end;
procedureTForm1.frDesigner1SaveReport(Report:TfrReport;varReportName:String;SaveAs:Boolean;varSaved:Boolean);beginifSaveAsthenwithMySaveDialogdobeginSaved:=ShowModal=mrOk;ifSavedthenbeginReport.SaveToBlobField(...);ReportName:=...;end;endelseReport.SaveToBlobField(...);end;
Q:在QR中,我可以写这样的代码:QRLabel1.Caption:='Sometext'.我可以用FR这样做吗?
A:FR对象并不是一个组件(这并不像QR,RB).但使用TfrReport.FindObject方法可以通过对象名称找到该对象。
vart:TfrMemoView;begint:=TfrMemoView(frReport1.FindObject('Memo1'));ift<>nilthent.Memo.Text:='FastReport';end;
Q:我想在用户预览(TfrPreview组件)中自定义热键?
A:这个组件有个窗口:TForm属性.将自定义句柄指定到Window.OnKeyDown属性.
Q:FastReport2.4不能装载FreeReport2.21文件?
A:这仅需要使用16进制数改变报表文件的第一字节,然后在源代码中修改下面的部分。在这些修改之后,装载报表并保存它.最后,返回到源代码处.
functionReadString(Stream:TStream):String;begin{iffrVersion>=23then}Result:=frReadString(Stream){elseResult:=frReadString22(Stream);}end;
procedureReadMemo(Stream:TStream;Memo:TStrings);begin{iffrVersion>=23then}frReadMemo(Stream,Memo){elsefrReadMemo22(Stream,Memo);}end;
procedurefrReadMemo(Stream:TStream;l:TStrings);vars:String;b:Byte;n:Word;beginl.Clear;l.Text:=frReadString(Stream);exit;Stream.Read(n,2);ifn>0thenrepeatStream.Read(n,2);SetLength(s,n);Stream.Read(s[1],n);l.Add(s);Stream.Read(b,1);untilb=0elseStream.Read(b,1);end;
functionfrReadString(Stream:TStream):String;vars:String;n:Integer;b:Byte;beginStream.Read(n,4);SetLength(s,n);Stream.Read(s[1],n);if(n>0)and(s[n]=#$0A)thenSetLength(s,n-2);//Stream.Read(b,1);Result:=s;end;
Q:怎样不在打印预览中打印报表?A:这里有一段代码:
frReport1.PrepareReport;frReport1.PrintPreparedReport('',1,True,frAll);或frReport1.PrintPreparedReportDlg;
Q:我想在报表中旋转图片。问题是这张图片是由我的应用程序生成的。是否有方法可以在打印前将这幅图片装载到报表中?
A:使用TfrReport.OnBeforePrint事件:
ifView.Name='Picture1'thenTfrPictureView(View).Picture.LoadFromFile(...)或.Assign或.你所想要做的任何事情
每天早上敲醒自己的不是闹钟,是夢想!
fastreport控件的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于FastReport的使用方法、fastreport控件的信息别忘了在本站进行查找哦。