Delphi中用FastReport制作报表
- 格式:doc
- 大小:25.50 KB
- 文档页数:3
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设计和制作报表
葛涛
【期刊名称】《微型电脑应用》
【年(卷),期】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], 徐宁;宗宁
因版权原因,仅展示原文概要,查看原文内容请购买。
“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区设置选项。
图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 相应记录。
字段名、字段数不确定时,用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报表常用方法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)打印——查询数据——预览——打印,选择多张单据进行连打。
delphi fastreport 用法Delphi FastReport 用法Delphi 是一种强大的编程语言,它提供了快速开发应用程序的能力。
而 FastReport 是一个插件,能够为 Delphi 提供报表设计和生成功能。
本文将介绍 Delphi FastReport 的用法,包括报表设计、数据源使用、导出和打印等。
1. 报表设计打开 Delphi,创建一个新的项目,加入 FastReport 模块后,双击报表设计器,进入报表设计界面。
在左侧的工具栏中,有各种控件,如标签、文本框、图像等。
可以将这些控件拖到报表上,设置它们的属性,如字体、大小、颜色等。
2. 数据源使用在报表设计中,如何引用数据源呢?首先需要将数据源组件(如FIBPlus、IBX、ADO 等)添加到 Delphi 项目中。
然后,可以在报表设计器中找到 Data Tree 栏,在其中选择需要使用的数据源和数据表。
3. 报表导出在制作完报表后,需要将其导出为其他格式,比如 PDF、Excel、Word、HTML 等。
FastReport 在导出前,需要安装相关的导出 DLL 文件。
再使用 Export 模块,选择需要导出的文件格式,单击导出即可。
4. 报表打印制作好的报表导出后,还需要将其打印出来。
EasyPrint 模块为FastReport 提供了强大的打印功能。
首先需要在程序中载入EasyPrint 模块,并设置打印参数。
接着使用 Report.Print 方法,即可将报表打印出来。
总结:以上是 Delphi FastReport 的简单用法介绍,具体使用还需要根据实际情况进行调整。
同时,建议多多研究相关的 API 文档和示例代码,以加深对 FastReport 和 Delphi 的理解和掌握。
DELPHI第三方控件及组件大全(安装方法与使用)DELPHI是一种非常流行的应用程序开发环境,用于创建Windows应用程序。
作为一个强大的集成开发环境,DELPHI提供了许多内置的控件和组件,但有时候这些内置的功能并不能完全满足我们的需求。
在这些情况下,我们可以使用第三方控件和组件来扩展DELPHI的功能。
以下是一些常用的DELPHI第三方控件和组件以及安装方法和使用介绍。
FastReport是一款用于生成报表的控件,它提供了丰富的报表设计和输出选项。
使用FastReport,可以轻松地创建各种类型的报表,如表格报表、条形码报表、图形报表等。
它还支持多种输出格式,包括PDF、Excel、HTML等。
TeeChart是一个功能强大的图表控件,可以帮助你在应用程序中添加各种类型的图表,如柱状图、饼图、折线图等。
它提供了丰富的图表样式和定制选项,使你可以根据需要创建独特的图表。
Devart提供了一系列数据库组件,用于与各种类型的数据库进行交互,如MySQL、Oracle、SQL Server等。
这些组件提供了方便的API和功能,使你可以轻松地连接、查询和更新数据库中的数据。
VirtualTreeview是一个高性能的虚拟树控件,用于显示大量数据。
相比于传统的树控件,VirtualTreeview具有更快的显示速度和更小的内存占用。
通过使用VirtualTreeview,你可以在应用程序中展示和管理大规模的树形数据。
这些第三方控件和组件在DELPHI开发过程中是非常有用的工具。
使用它们可以大大提高开发效率和应用程序的质量。
安装方法有所不同,但一般来说,你只需按照安装向导进行操作即可。
安装完成后,你可以在DELPHI的开发环境中使用它们。
使用这些控件和组件的方法也各不相同,具体的使用方法可以参考各个控件和组件的官方文档或教程。
一般来说,你需要将控件或组件放置在窗体上,并根据需要进行配置和定制。
然后,你可以在代码中使用相应的属性和方法来操作控件或组件。
fastreport使用教程之图表FastReport允许用户插入chart制表组件到报表中,这样,在FastReport 面板上的“TfrxCharObject”组件就必须应用上。
这个组件基于“TeeChart”动态库,在delphi中需要将它包含在工程中。
我们通过以下示例先进行简单说明,连接DBDemos中的countory表,数据内容如下:在delphi环境中创建一个新的工程,添加“TTable”,“TfrxChartObject”,“TfrxDBData”,“TfrxReport”组件,并设置属性值:Table1:DatabaseName='DBDEMOS'TableName='country.db'frxDBDataSet1:DataSet=Table1UserName='Country'进入到报表设计器页面,并连结设置数据源。
在报表的设计页上放置一个“chart”组件,并调整其大小(18X8cm)。
双击组件,打开组件的编辑器窗口。
char编辑器区域说明:1:chart结构,一个chart包含有几个制表系统。
2:组件监视器,显示所选组件的属性。
3:连结chart的series的数据属性。
开始的界面显示如上,首先添加一个或几个series,在1区点击按钮,添加一个Pie。
有许多可用的不同的类型的series。
添加一个系列之后,3区被激活。
首先选择数据源,设置Label和pie字段。
点击确定按钮,关闭编辑器窗口,然后预览。
还如何改良以下报表呢?首先,将数据按升序方式进行排序。
再次进入编辑器,选择要设置的series,在3区设置选项。
1、chart数据中数字的限制上面的制表看上去非常拥挤,在chart中有特别多的值,而有些看不见。
FastReport可以设置显示数据的限制性。
因此不被限制的值可以在制表中显示。
在我们的示例中,包含18个数值,而最多友8个能显示,键入编辑器,进行设置。
FastReport教程简介FastReport是一款功能强大且易于使用的报告生成工具。
它提供了丰富的报告设计功能,并支持多种数据源。
FastReport广泛应用于软件开发、数据分析和业务报表等领域。
本教程将介绍FastReport的基本用法和一些常用功能。
安装要使用FastReport,我们首先需要安装它。
FastReport支持多种开发环境,如Delphi、C++Builder、.NET等。
你可以根据自己的开发环境选择合适的版本进行安装。
Delphi环境如果你使用Delphi进行开发,可以按照以下步骤安装FastReport:1.在FastReport官网下载最新版本的安装包;2.运行安装包,按照提示进行安装;3.在Delphi的组件面板中找到FastReport组件,将其拖放到窗体中。
.NET环境如果你使用.NET进行开发,可以按照以下步骤安装FastReport:1.在FastReport官网下载最新版本的安装包;2.运行安装包,按照提示进行安装;3.在Visual Studio中打开项目,通过NuGet下载并安装FastReport。
创建报表创建报表是使用FastReport的第一步。
在FastReport中,我们可以使用设计器来创建报表模板,并在代码中加载和填充数据。
下面是创建报表的基本步骤:1.打开FastReport设计器,新建一个报表项目;2.在报表中添加数据源,可以是数据库、XML文件或自定义数据源;3.在报表中添加报表控件和数据绑定,设计报表样式;4.在代码中加载数据,并预览或导出报表。
加载数据在FastReport中,我们可以使用多种方式加载数据:数据库如果你的报表数据存储在数据库中,你可以使用FastReport提供的数据库连接工具加载数据。
首先需要设置数据库连接参数,然后通过SQL查询或存储过程获取数据。
```csharp using FastReport.Data;// 创建数据库连接 var connection = new Connection(); connection.ConnectionString =。
Delphi生成网页(html)报表Delphi 生成网页(html)报表在整理硬盘的时候,突然发现了这个小东西,回想起来是好多年前给永恩集团 (达芙妮) 做连锁POS系统的时候做的一个用DELPHI 生成HTML报表的测试(我已经5年没用DELPHI 了)。
为什么要求这么变态?我当初给达芙妮用 fastreport 做了一个报表,格式和数据展示完全满足要求,但最终被拒绝了,其原因是,他们原来有一套oracle erp 的打印就是用HTML 网页形式打印的。
我很崩溃,我记得oracle 里面的report builder 也很强的,为什么不用?其实到现在我仍然坚持用fastreport 做是对的,但当时,人家是客户,非得用html 的,你也没办法,人家就喜欢在浏览器里点右键打印,哎,这年头,什么样的需求都有。
当时这个团队没有去坐调研,我只好抽晚上空余时间,看了下资料,解决了这个问题,其实很简单,纯体力活。
delphi 里面有 webbrowser 控件,在这个上面直接输出html 代码就可以了。
你可以先用html做好一个模板,然后往里面填写数据即可。
这个报表很复杂的,涉及到分组,汇总聚合。
分类汇总,明细等在一个报表上。
也就是一个结构复杂的html 页面。
结构的复杂,说白了是体力活,其关键点:生成html模板举个很简单的例子,头部:{报表头部分一,6个参数}HTML_LZS_HEAD_ONE='<TABLE cellSpacing=0 border=0> '+'<TBODY> '+'<TR> '+'<TD align=right>分公司:</TD> '+'<TD align=left>%s</TD></TR> '+'<TR> '+'<TD align=right>经营小组:</TD> '+'<TD align=left>%s</TD></TR> '+'<TR> '+'<TD align=right>门店:</TD> '+'<TD align=left>%s</TD></TR>'+'<TR>'+'<TD align=right>年:</TD> '+'<TD align=left>%s</TD></TR> '+'<TR> '+'<TD align=right>月:</TD> '+'<TD align=left>%s</TD></TR> '+'<TR> '+'<TD align=right>单据状态:</TD> '+'<TD align=left>%s</TD></TR> '+'</TBODY> '+'</TABLE> ';从数据库中查询数据,得到结果,并填充F_HEAD_ONE:=Format(HTML_LZS_HEAD_ONE, [aqryPublic.FieldByName('SUBCOMPANY_ID').AsString, aqryPublic.FieldByName('WORKING_GROUP').AsString,aqryPublic.FieldByName('SHOP_ID').AsString,aqryPublic.FieldByName('REFERENCE_YEAR').AsString,aqryPublic.FieldByName('REFERENCE_MONTH').AsString,Fst ate]);这样我们就生成了一小段html 代码,如何显示在webbrowser 上呢?procedure TFrmReport.ShowHtml(content: widestring);varv: Variant;HTMLDocument: IHTMLDocument2;beginv := VarArrayCreate([0, 0], varVariant);v[0] := content;HTMLDocument := WebBrowser1.Document as IHTMLDocument2;HTMLDocument.write(PSafeArray(TVarData(v).VArray));HTMLDocument.close;HTMLDocument := nil;end;另外要注意initialization OleInitialize(nil); finalization OleUninitialize;。
用Delphi+FastReport解决ERP系统开发中单据打印的实例探索5700字摘要:本文用Delphi+Fastreport为例介绍了用数据库后台存储单据文件前台进行调用很好的解决了后台存储与用户本地自定义设置之间的矛盾,还介绍了通过编写通用式主从结构的单据打印程序快速解决各种单据的打印输出以及用cross-tab技术解决交叉表样式报表的输出。
这些方法的实现很好的解决了ERP系统中单据输出和报表打印问题,同时较方便的实现了用户对单据和报表样式自定义的需求。
zuoe(‘xt_bill_attach’)).LoadFromStream(SetStream); try Post; MessageDlg(‘报表文件上传成功!’, mtInformation, [mbOk], 0); Requery; GotoBookmark(OldBookMark); except MessageDlg(‘报表文件上传过程中遇到了错误,上传失败!’, mtError, [mbOk], 0); end; end; 2、通用的主从式单据打印解决方案:在ERP系统应用中,单据种类复杂,有采购计划、采购订单、采购收货通知单、销售订单、销售出库通知单、库存调拨单、库存领用单等等,但仔细分析后我们发现其结构均为主从式的数据模型,为了找到通用的解决方案,我们在Delphi项目的DM模块下,增加ADOQueryParent作为主表的数据源,增加ADOQueryChild作为子表的数据源,增加frDBDataSetOrder作为FastReport数据源,增加frReportOrder作为FastReport作为报表控件,前端通过后台数据库的视图实现用户对数据源的控制,减少了对前台应用程序的维护频度,实现了报表文件、访问方式和数据源三者既相互独立,又兼顾统一。
2.1调用报表的过程描述如下:procedure PrintCheck(ReportName, --报表名称MasterViee, --主项数据视图名称MasterKeyFieldName, --主项数据关键字段名称DetailViee, --明细项数据视图名称DetailKeyFieldName, --明细数据关联字段名称SortByField --数据源排序字段名称: string; KeyFieldV alue: variant); 2.2过程代码如下:procedure PrintCheck(ReportName, MasterViee, MasterKeyFieldName, DetailViee, DetailKeyFieldName, SortByField: string; KeyFieldV alue: variant); Begin // 指定主项数据源‘ + MasterViee + ‘ e + ‘=:’ + MasterKeyFieldName); Parameters.Items[0].V alue := KeyFieldValue; Open; end; // 指定明细项数据源‘ + DetailViee + ‘ DetailKeyFieldName + ‘=:’ + DetailKeyFieldName); SQL.Add(‘ order by ‘ + SortByField); Parameters.Items[0].V alue := KeyFieldV alue; Open; end; // 装载相应单据 e from xt_bill eters.Items[0].V alue := ReportName; Open; if (DM.frDBDataSetOrder.DataSet DM.ADOQueryChild)then DM.frDBDataSetOrder.DataSet := DM.ADOQueryChild; BlobField(FieldByName(‘xt_bill_attach’)); // 从相应字段进行装载Title := FieldByName(‘xt_bill_name’).V alue; Sho示方式外经常会遇到交叉表式的数据输出要求,依靠传统的报表设计工具和方式显得特别麻烦,FastReport提供了一个Cross-tab的对象可以解决这个问题,但笔者经过多次反复测试后发现只有数据源提供正确且设置合理才会得到我们想要的输出格式。
delphi fastreport 打印简单例子以下是一个使用Delphi和FastReport打印的简单例子:1. 首先,打开Delphi并创建一个新的VCL应用程序项目。
2. 在工具栏上找到FastReport组件,在主窗体上拖放一个`TfrxReport`组件。
3. 在菜单中选择"File" -> "New" -> "Data",创建一个新的数据集。
4. 在数据集设计器中,添加一些字段,并添加一些数据。
5. 返回主窗体,在Form的`OnCreate`事件中,添加以下代码:```delphiprocedure TForm1.FormCreate(Sender: TObject);varReport: TfrxReport;Designer: TfrxDesigner;beginReport := TfrxReport.Create(nil);Designer := TfrxDesigner.Create(nil);try// 加载FastReport模板文件Report.LoadFromFile('报表文件路径');// 将数据集与报表关联Report.DataSets.Add(DataSet1);// 显示报表设计界面Designer.Report := Report;Designer.ShowModal;// 打印报表//Report.PrepareReport;//Report.Print;finallyDesigner.Free;Report.Free;end;end;```6. 运行应用程序,点击按钮时将打开FastReport设计器界面,您可以在其中设计和预览报表。
7. 如果要打印报表,取消`FormCreate`方法中的注释,并确保您在报表文件路径中指定了正确的模板文件路径。
8. 运行应用程序,点击按钮即可打印报表。
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是程序运行时生成的报表预览效果。