Delphi中用FastReport制作报表
DELPHI控件FastReport中文Memo显示问题的完美解决方案.

DELPHI控件FastReport中文Memo显示问题的完美解决方案.本文转自,因为我用的FastReport版本还要高,所以没有用到作者提到的第三种解决方案。
问题描述,正如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);beginif CompareText(VarName, 'MyVar1') = 0 thenValue := 'Hello.';end二、设计时Memo内容为空,在Show报表前给Memo控件赋值。
Delphi中运用FasReport设计和制作报表

Delphi中运用FasReport设计和制作报表
葛涛
【期刊名称】《微型电脑应用》
【年(卷),期】2004(020)003
【摘要】报表的设计和制作是管理信息系统中一项重要而复杂的工作,而Delphi 所附带的报表工具不能完全满足用户各种要求.本文介绍的运用FastReport设计和制作报表是一种有效快捷的方法,首先介绍了这种方法的特点,详细说明了报表设计和制作的过程,最后给出了报表设计的实例.
【总页数】2页(P63-64)
【作者】葛涛
【作者单位】军械工程学院,助教,石家庄,050003
【正文语种】中文
【中图分类】TP3
【相关文献】
1.Delphi中根据字段值内容不同输出不同颜色字体的报表制作方法 [J], 薛梅
2.Delphi中调用Excel制作报表的方法 [J], 蒋丽华;雷佳兵
3.在Delphi中制作分栏报表 [J], 陈建华
4.用QuickReport2.0ForDelphi设计和制作报表 [J], 何蓓;俞集辉
5.在Delphi中制作固定序号的报表 [J], 徐宁;宗宁
因版权原因,仅展示原文概要,查看原文内容请购买。
快速报表系统FastReport4用户使用手册_修改版

“Reprint headers on new page”决定在多个页面打印时,是否在每个页面当打印输出标题栏。
“Side by side cell”:是否允许合并单元格“Join equal cells”选项,当数值相等时是否可以合并单元格。
使用对象查看器的属性设置也可以设置这些内容。
第八章FastReport允许用户插入chart制表组件到报表中,这样,在FastReport面板上的“TfrxCharObject”组件就必须应用上。
这个组件基于“TeeChart”动态库,在delphi 中需要将它包含在工程中。
我们通过以下示例先进行简单说明,连接DBDemos中的countory表,数据内容如下:在delphi环境中创建一个新的工程,添加“TTable”,“TfrxChartObject”,“TfrxDBData”,“TfrxReport”组件,并设置属性值:Table1:DatabaseName = 'DBDEMOS'TableName = ''frxDBDataSet1:DataSet = Table1UserName = 'Country'进入到报表设计器页面,并连结设置数据源。
在报表的设计页上放置一个“chart”组件,并调整其大小(18X8cm)。
双击组件,打开组件的编辑器窗口。
char编辑器区域说明:1:chart结构,一个chart包含有几个制表系统。
2:组件监视器,显示所选组件的属性。
3:连结chart的series的数据属性。
开始的界面显示如上,首先添加一个或几个series,在1区点击按钮,添加一个Pie。
有许多可用的不同的类型的series。
添加一个系列之后,3区被激活。
首先选择数据源,设置Label和pie字段。
点击确定按钮,关闭编辑器窗口,然后预览。
还如何改良以下报表呢?首先,将数据按升序方式进行排序。
再次进入编辑器,选择要设置的series,在3区设置选项。
Fastreport使用经验(转)在Delphi程序中访问报表对象

文字错位,而且表格会打印得很小。而且原文中打印坐标的确定,必须靠反复的试验才能达到比较满意的效果。
针对原目标,笔者设计了一段程序。首先在窗体上添加一个DBGrid来显示我们所要打印的数据,在这里,DBGrid不只是起到显示数据的作
用,而且用户对DBGrid作的调整,例如改变了各字段的排列顺序,各字段的显示宽度等,都将直接反映到打印结果中去,也就是说,我们实际
******共用TFrxreport及TfrxDBDataSet
一个程序中,不管多么大的程序,只要打印或预览时是模式的,则完全可以共用一个TFrxreport变量及几个TfrxDBDataSet。只不过,要注意完
成一个报表程序的步骤,主要是下面几步
1)清除报表,得到一个全新的报表内容。
Frxreport1.clear。
可能需要传递很多参数,效率低下。
2)把不同报表的控制放到脚本中,可以实现报表的模块化,程序只是简单的设置数据集的关系,并加载硬盘上的报表文件,不同报表的不同实
现方式,显示方式,均放到报表文件中,程序简洁,易维护,易升级。
当然,这样的缺点就是程序中加载报表时的数据集别名必须与设计报表时的别名一致。
TopBlank=1;
BottomBlank=1;
var
PointX,PointY:integer;
PointScale,PrintStep:integer;
function PelsTomm(Pels:Extended):Extended;
begin
Result:=Pels/Screen.PixelsPerInch*25.4;
end;
procedure PrintSerial(Frx:TFrxReport;SequencePage:Byte=0);
用Delphi_FastReport解决ERP系统开发中单据打印的实例探索

图1:单据管理示意图摘要:本文用Delphi+Fastreport 为例介绍了用数据库后台存储单据文件前台进行调用很好的解决了后台存储与用户本地自定义设置之间的矛 盾,还介绍了通过编写通用式主从结构的单据打印程序快速解决各种单据的打印输出以及用cross-tab 技术解决交叉表样式报表的输出。
这些方法的 实现很好的解决了ER P 系统中单据输出和报表打印问题,同时较方便的实现了用户对单据和报表样式自定义的需求。
关键词:ER P 系统;后台;套打;交叉表;单据 中图分类号:T P302.1 文献标识码:A 文章编号:1003-9767(2011)05-0054-03下载:将存于后台表中的单据字段通过流文件方式保存至本地相 1. 单据文件的存储与用户自定义FastReport 中报表默认是以文件形式存储于各客户端本地系统 中,以其调用速度快而获得程序的首选,但这种方式更新时必须在各 客户端站点之间进行手动同步操作,给后期的报表维护带来了极大的不便,因此往往适用于站点数量较少的系统应用场合,在ER P 系统应用中,一般采用将FastReport 报表文件以image 字段的形式存储于后台数据库中,再通过相应的下载和上传操作实现对数据库内image 字段(即相应报表文件)的修改。
应的报表文件。
try SetStream := TFileStream.Create(ReportFileName, fmC reate orfmShareExclusive);// 保存相应字段内容到文件流中 TBlobField(ADOQueryBill.FieldByName('xt_bill_attach')). SaveToStream(SetStream);MessageDlg('报表文件下载成功!', mtInformation, [mbOk], 0);exceptMessageDlg('报表文件下载过程中遇到了错误!', mtError,[mbOk], 0);end; 上传至服务器:将重新设置的本地报表文件上传至后台表xt_bill 相应记录。
用Delphi中FastReport设计数据库报表

①定义系统变量
打开报表设计器 ,在文件菜单栏下点击数据字典 即可定义
系统 变量 ( 图 4所示 )。 如
图 4 定义 系统变量
②程序 中变量赋值 在 f e ot r pr对象 的 O G tau (事 件中完成变量 的赋值 , R n e le ) V 代码如下 : poe ueT eJs_ pr f e otG t a e rc d r s !i r f r p r eV l l t e m. R 1 u
当前 日期和报表页 弓 町以通过表达式编辑器插入系统变量
和系统函数。
4 7 0瞌 3 1 电20,砖与 一 … ■ 藿 巧 臻 、 一拄 护-
…
维普资讯
e d n;
③报表引用系统变量
双 击页面上 操作员矩 形对 象 ( f e o i Tr m Ve M w),打开 文本 编辑器 ,通过表达式编辑器 ( 如图 5 所示 )来 引用 已定 义的销 售 明细表 中操作员和单位名称变量 。这样在 打印预览或打印中
( o s aNa c n tP r me:ow。o. 0 eV (Iti f ifpln T me r 每 r 咚 Rr l F e 1 时n l - e | g i l
一
、
概 述
实际的数据库 J用 系统 开发中 ,经常遇到用户报表设 计” 、
发 的任 务。住 D lh 中用 户报表设 汁中, 用 Q i eot e i p 利 uc R p r、 k
R v eo s ateot 可视 化报 表 设 计工 具 ,就 可以在 aeR pt 、F s pr 等 R D lh 开发环境 中使 用这 组件来设计数据库报表 了。下面通 e i p
FastReport4(Delphi)动态生成报表

字段名、字段数不确定时,用FastReport4 动态生成报表Delphi xe3 + FastReport4.14.1ADOConnection,ADOQuery,DatasetProvider,ClientDataSet,DataSource,FrxDBDataset1,FrxReport屬性設置,不在這裡詳述。
效果圖:unit Unit1;interfaceusesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids, Vcl.DBGrids, Datasnap.Provider, Data.Win.ADODB, Data.DB, Datasnap.DBClient, frxClass, frxPreview, frxDesgn, frxDBSet;typeTForm1 = class(TForm)ADOConnection1: TADOConnection;DataSource1: TDataSource;ClientDataSet1: TClientDataSet;ADOQuery1: TADOQuery;DataSetProvider1: TDataSetProvider;DBGrid1: TDBGrid;Button1: TButton;Button2: TButton;frxDBDataset1: TfrxDBDataset;frxDesigner1: TfrxDesigner;frxPreview1: TfrxPreview;frxReport1: TfrxReport;Button3: TButton;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);procedure Button3Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);beginclientdataset1.Close;mandText:= 'select user_id,user_name ,sal_no from t_user '; clientdataset1.Open;end;procedure TForm1.Button2Click(Sender: TObject);varpDataPage :TfrxDataPage;pPage :TfrxReportPage ;pBand :TfrxBand;pDataBand :TfrxMasterData ;pMemo :TfrxMemoView ;i:integer;x,y,z,width:extended;begin// 清除原报表内容frxReport1.Clear;// 设置Report 的DataSetfrxReport1.DataSets.Add(frxDBdataset1);// 添加Report 的Data 页pDataPage := TfrxDatapage.Create(frxReport1);// 增加报表显示内容pPage := TfrxReportPage.Create(frxReport1);ppage.CreateUniqueName();// 设置Fields 的默认尺寸pPage.SetDefaults;// 页面方向// pPage.Orientation := poLandscape;// 页面边距pPage.TopMargin := 20;pPage.LeftMargin := 20;pPage.RightMargin := 20;pPage.BottomMargin := 20;// 创建报表Title BandpBand := TfrxReportTitle.Create(pPage);pBand.CreateUniqueName();pBand.Top := 0;pBand.Height := 20;// 创建显示Field 的MemopMemo := TfrxMemoView.Create(pBand);pMemo.CreateUniqueName();pMemo.Text := 'Hello FastReport!';pMemo.Height := 20;// 风格pMemo.Align := baWidth;// 创建DataBandpDataBand := TfrxMasterData.Create(pPage);pDataBand.CreateUniqueName();pDataBand.DataSet := frxDBDataset1;pDataBand.Top := 100;pDataBand.Height := 20;// 将Memo 添加到DataBand 上pMemo := TfrxMemoView.Create(pDataBand);pMemo.CreateUniqueName();// 连接数据pMemo.DataSet := frxDBDataset1;// 显示username 字段pMemo.DataField := 'user_name';pMemo.SetBounds(0, 0, 100, 20);// memo 带边框pMemo.Frame.Typ := [ftLeft , ftRight , ftTop , ftBottom];// 风格pMemo.HAlign := haRight;// 报表显示frxReport1.ShowReport(true);end;procedure TForm1.Button3Click(Sender: TObject);varpDataPage :TfrxDataPage;pPage :TfrxReportPage ;pBand :TfrxBand;pDataBand :TfrxMasterData ;pMemo :TfrxMemoView ;pTitle :TfrxReportTitle;pPageHeader :TfrxPageHeader;pPagetFooter :TfrxPageFooter;i:integer;x,y,z,width:extended;poPortrait, poLandscape: TPrinterOrientation ;beginwidth:= 80 ; // 字段宽度x:= 0 ;y:= 0 ;z:= 0 ;frxReport1.Clear;frxReport1.DataSets.Add(frxDBdataset1);pDataPage := TfrxDatapage.Create(frxReport1);pPage := TfrxReportPage.Create(frxReport1);ppage.CreateUniqueName();pPage.SetDefaults;pPage.Orientation := poLandscape; // 橫印,poPortrait: 直印(默認),pPage.TopMargin := 10; // 上邊距(mm)pPage.LeftMargin := 20; // 左邊距(mm)pPage.RightMargin := 20; //右邊距(mm)pPage.BottomMargin := 15; // 下邊距(mm){pBand := TfrxReportTitle.Create(pPage);pBand.CreateUniqueName();pBand.Top := 0;pBand.Height := 20;}pTitle := TfrxReportTitle.Create(pPage);pTitle.CreateUniqueName();pTitle.Top := 0;pTitle.Height := 30;// 標題頭pMemo := TfrxMemoView.Create(pTitle);pMemo.CreateUniqueName();pMemo.Text :='AutoReport for FastReport4.14';pMemo.SetBounds(0,0,300,30); //MemoView :長、寬、高;pMemo.Font.Size := 14 ; // 14號字pMemo.Font.Style :=[fsBold]; // 粗體pMemo.Height := 30;pMemo.Align := baCenter; // MemoView:居中;// 創建表頭欄pPageHeader := TfrxPageHeader.Create(pPage); pPageHeader.CreateUniqueName;pPageHeader.Top := 50;pPageHeader.Height:= 20;for i := 0 to clientDataset1.FieldCount -1 dobegin// 表頭欄位pMemo := TfrxMemoView.Create(pPageHeader);pMemo.CreateUniqueName();pMemo.Text := clientDataset1.Fields[i].FieldName; pMemo.SetBounds( i * width, 0, width, 20);pMemo.Frame.Typ:=[ftLeft , ftRight , ftTop , ftBottom]; pMemo.Height := 20;// 风格// pMemo.Align := baWidth;pMemo.Align := baLeft;end; // end for ;// 创建DataBandpDataBand := TfrxMasterData.Create(pPage);pDataBand.CreateUniqueName();pDataBand.DataSet := frxDBDataset1;pDataBand.Top := 100;pDataBand.Height := 20;for i := 0 to clientdataset1.FieldCount-1 dobegin// 将Memo 添加到DataBand 上pMemo := TfrxMemoView.Create(pDataBand);pMemo.CreateUniqueName();// 连接数据pMemo.DataSet := frxDBDataset1;// 显示username 字段pMemo.DataField := clientDataset1.Fields[i].FieldName;pMemo.SetBounds( i * width, 0, width, 20); // setBountds(X横行起点,Y起点,字段宽度,字段高度)// memo 带边框pMemo.Frame.Typ:=[ftLeft , ftRight , ftTop , ftBottom];// 风格// pMemo.HAlign := haRight; // 字右對齊;pMemo.HAlign := haLeft;end; // end for ;// 报表显示frxReport1.ShowReport(true);end;end.。
Delphi FastReport报表常用方法

Delphi FastReport报表常用方法1.单据中有多行数据,但预览时只显示部分内容,或者打印内容行与行之间有间隔OR属性中:设置RowCount=0,Start New Page为False;Stretched为True.说明:RowCount:控制总共打印几行;RowCount=0是打印全部;Start New Page:打印前先跳页;每页打印一行;Stretch:表身自动伸缩根据表身内容;2.在打印中设置金额或数量的小数位数FASTREPOR属性中:使用DisplayFormat(数据显示格式)——数字——1234.50%2.0f:以整数形式显示;%2.2f:显示两位小数;%2.3f:显示三位小数位,可根据情况进行调整。
3.在打印中设置日期/时间的格式FASTREPOR属性中:使用DisplayFormat(数据显示格式)——日期/时间——11.28.2002mm.dd.yyyy:显示月.日.年mm.dd:显示月.日mm:显示两位的月4.当栏位的值为零时显示为空FASTREPOR属性中:设置HideZeros(数字前面的0是否显示)为True5.自动换行1)选择数据单元进行群组;2)StretchMode为smMaxHtight;WordWrap为True;Stretched为True.说明:StretchMode:对象伸缩的行为;WordWrap:文本是否自动换行;6.合计[SUM(<进/销/退/折表身档."AMTN_NET">,MasterData2)]7.每页合计将定义好的合计函数放到‘栏尾’中即可。
8.全表合计将定义好的合计函数放到‘报表合计’中即可。
9.金额大写在报表设计中使用函数:ConbertNumToChinese()合计金额大写:[ConvertNumToChinese(SUM(<进/销/退/折表身档."AMTN_NET">,MasterData2))]负数合计金额大写:[ConvertNumToChinese(Abs(SUM(<进/销/退/折表身档."AMTN_NET">,MasterData2)))]10.报表中打印行数在报表设计中使用变量——系统变量Line#11.连打1)单据——速查,查出要打印的单据;2)打印——查询数据——预览——打印,选择多张单据进行连打。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Delphi中用FastReport制作报表
报表作为系统信息的典型输出形式之一,是大多数应用系统非凡是MIS系统的重要功能。
是否具有一个良好的打印功能,往往从一定程度上关系到系统的成败。
Delphi有很强的报表功能,但是它的报表功能还不能满足我们的需要。
于是许多Delphi高手相继推出了不少优秀的报表控件(模块),作为QuickReport的补充,其中FastReport就是一个代表。
FastReport综合了QuickReport和Re portBuilder的优点,个头小,速度快,并带有全部源码。
笔者在开发一个药品治理系统时,用FastReport2.51成功制作出了和药品验收单、药品调拨单一模一样的表单式报表。
下面给朋友们介绍一下。
FastReport2.51下载地址:http ///soft/8805.Html。
报表的需求分析
在医院工作的朋友都知道,药品入库时要填写药品验收单,药房工作人员领取药品时要填写药品调拨单。
笔者单位使用的药品验收单和调拨单不是专用的,而是通用的商品验收单和调拨单。
与百货业、电信系统使用的报表不同,它的外形为条形,每张固定可填五种药品,内容包括发货单位、发货单号、收货单位、品名、规格、单位、价格、金额等,一式三联。
综上所述,我们可以把报表设计的需求归纳如下:
1. 大小为:长21cm,宽10cm;
2. 每张可以打印5种药品,表单下面有本页小计。
3. 多于5种药品时开始新一张表单的打印,不足5种药品时要用空行补足。
报表设计
1.打开FastReport的报表设计器,按照图1设计出“药品验收单”。
另外,InHJ、OutHJ、CaHj、LineCount这几个变量分别表示“入库合计”、“出库合计”、“差价合计”和“数据总行数”,在程序中将对这几个变量赋值。
2.按F11键,调出对象查看器,选中Band2,在它的OnBeforPrint事件中输入如下代码:
begin
if LINE# -1<>0and LINE# -1mod 5=0then
begin
showBand Child1
showBand band1
end
代码中用FastReport的内置函数 LINE# 取得当前行号,假如满足条件,就显示页头和Child3,开始新的一张表单。
3.选中Child3,在它的OnBeforPrint事件中输入如下代码:
begin
lin = lineCount //在程序中要对该变量赋值
while lin mod 5<>0do
begin
showband child2 //打印空行
inc lin
end
showBand child3
end
这段代码的用途是假如最后数据行不够一张表单显示时,就打印空行。
4. 选中Band3,在它的OnBeforPrint事件中输入如下代码:
begin
showband child1 //到达报表结束时显示表单底部的内容
end
5.将报表保存后回到Delphi开发环境。
Delphi编程部分
在Delphi编程部分我们主要完成报表所需参数的传递,因为要在好几个过程中访问这些参数,所以要将这几个参数设为全局变量:
private
line1 line2 integer //保存行号
inputXj intemp //入库小计,每5行后清零,下同
outXj outemp //出库小计
CajiaXj catemp Real //差价小计
下面是几个主要过程的代码清单。
//单张表单数据合并过程
procedure TInputForm.frDBDataSet1Next Sender TObject
var
ReCount integer
begin
ReCount = Adoruku.RecordCount
Inc line1 // 该变量传至报表文件控制打印空行
Inc line2 // 该变量控制清零小计值
if not Adoruku.Eof then
inputXj =inputXj+ADORuku.fieldByName '入库金额'.AsFloat
outXj =outXj+Adoruku.fieldByName '出库金额'.AsFloat
CajiaXj =CajiaXj+AdorukuJXCJ.AsFloat
end
//每5行后将小计值清零
if line2 mod 5 = 0and ReCount> line2 div 5 5then
begin
intemp =inputXj
outemp =outXj
Catemp =CajiaXj
inputXj =0
outXj =0
CajiaXj =0
end
//到达数据集末尾时给变量赋值
if Adoruku.Eof then
begin
intemp =inputXj
outemp =outXj
Catemp =CajiaXj
end
end
以上程序在windows 2000/XP+Delphi6.0中调试通过。
至此,我们已经完成了药品验收单的设计工作,其他的类似报表设计可以参照以上过程。
图2是程序运行时生成的报表预览效果。