delphi实现打印报表功能
- 格式:doc
- 大小:24.50 KB
- 文档页数:2
用Word做Delphi报表输出工具用Word做Delphi报表输出工具崔先迤笔者在实际应用中发现,报表的内容一般很少变动,但其字体格式及版式是经常变动的,而且有时用户为了某种需要,不想修改数据库的真实内容而又要改变报表内容。
如果用ReportSmith可以解决前者问题,但对于后者则无能为力了,且其界面是英文的,不合用户习惯。
如果用3.0中的Qreport的报表部件,则两者都不能实时解决,必须修改原代码后重新编译才能使用。
而使用Word及Excel则完全可以克服以上不足。
具体实现如下(以Word实现为例):首先用Word编辑报表格式,并排好版,把将要输出的数据项用表单域代替,并取名。
这里我们暂时假设有表单域Item1及Item2(均为文本型),将这个文档存为模板文件Example.dot,然后按如下步骤进行:1)运行Delphi3,在Form1里加入一个System部件集里的TDdeClientCov 部件,取名为DdeExample,将其ConnectMode设为ddeManual(手动方式);将DdeService 设为‘(WinWord)';将ServiceApplication设为‘WinWord'。
2)编写一个自定义过程,以激活Word,如下:procedure Tform1.WordActive(Cmds: TStrings);varWordPath: String;beginif(not DdeExample.OpenLink) then {判断是否巳动态链接}beginif(FindWindow(′OpusApp′, nil)=0) thenbeginWordP ath := ′C:\msoffice\winword′;if(WordPath=′′) thenShowMessage(′中文Word未安装或未设置路径,请安装设置Word中文版。
′)elsebeginDdeExample.ServiceApplication := WordPath+′\Winword.exe′;if(DdeExample.OpenLink) {如果巳动态链接执行宏命令}then DdeExample.ExecuteMacroLines(Cmds,False)else ShowMessage(′无法启动Word中文版!′);DdeExample.ServiceApplication := ′WinWord.exe′;end;endelsebegin{如果巳动态链接执行宏命令}DdeExample.ExecuteMacroLines(Cmds,False);end;endelseDdeExample.ExecuteMacroLines(Cmds,false);end;在private声明区里加入如下:procedure ActiveWord(Cmds: TStrings);3)在Form1中加入一个按钮Button1,在其onclick事件里写如下代码:procedure TForm1.Button1Click(Sender: TObject);varCmds:TStringList;{创建Cmds}TempItem1,TempItem2:String;begincmds:=TStringList.Create;cmds.Clear;TempItem1:=′数据项一′;TempItem2:=′数据项二′;with Cmds dobeginClear;Add(′[FileNew.Template = ″Example.Dot″]′);{打开模板文件Example.Dot}Add(′[AppMaximize]′);{文档最大化}Ad d(′[SetFormResult ″Item1″,″′+TempItem1+′″]′);{将数据TempItem1传给表单域Item1}Add(′[SetFormResult ″Item2″,″′+TempItem2+′″]);{将数据TempItem2传给表单域Item2}end;WordActive(DdeExample,Cmds);{调用自定义过程}Cmds.Free;{释放Cmds}end;运行这个程序,单击Button1,大家可以发现Word被启动了,屏幕上出现了&ldquo:数据项一”数据项二&rdquo两个数据项。
在Delphi编程中利用Excel实现动态报表0 引言随着计算机技术的不断普及, 办公的数字化程度越来越高, 出现了大量的计算机系统, 如固定资产管理系统、人事工资管理系统等等。
这其中存在大量的MIS系统。
MIS系统的一个重要特点是需要处理大量数据并形成报表。
由于行业或者其他一些原因, 这些报表的格式种类繁多, 而且还有一些复杂报表。
这些报表的格式在开发期间可能都无法设定。
为了解决这些问题, 本文采用了表格功能强大的Excel作为报表模板, 用户可以按照自己的要求设置报表格式, 程序运行时再根据用户的设置动态填入数据, 从而实现动态报表功能。
1 实现原理先由用户按照自己的格式生成Excel报表模板, 系统读取模板文件, 并把模板文件存入数据库, 保存用户输入的报表信息, 如某一字段填入第几行第几列。
报表打印时, 提取相应的Excel文件, 利用Delphi的Excel控件填入数据库的数据, 实现动态报表功能。
2 实现过程2. 1 定义数据表系统使用MsSql Server2000数据库,定义两个表,一个是MB,用来存储报表基本信息和Excel文件,一个是MB_Detail存放报表的详细信息,如对应字段的行号和列号。
表结构如下:图1 MB 表结构图2 MB _Detail表结构MB表中,“模板内容”字段为image类型, 用来存储Excel模板文件,“记录类型”字段用来表示是单张表格(只打印一条记录)还是列表(打印多条记录); MB Detail表中的列号数据类型为char, 对应Excel中的列号如A、B、C等。
2. 2 保存和读取Excel模板2. 2. 1 保存Excel模板本系统将用户设置好的Excel报表模板存入数据库“模板内容”字段。
由于本字段存储的是Excel文件内容, 需要采用特殊的存储方式。
本系统使用Delph i的TO leContainer控件, 与Excel文件建立连接, 最后存入数据库。
最近在做一个Delphi的发货清单的打印程序,其中涉及到需要计算清单的小计和总计的功能,文字难以表达清楚,上图吧:报表第一页的小计计算当前页面的商品价格总和,总计目前和小计一样是计算截止到当前页面的所有商品的金额和,下图为最后一页:这下大家明白了吧,就是要实现这样的报表。
废话不多说了,开始讲解我的思路:1.既然要计算小计,就是每页的金额和了,加入ReportMachine的计算文本框(TRMCalcMemoView),然后设置要汇总的字段值为数据字段“factSum”,然后选择计算文本框的属性面板中的“CalcOptions”选中“统计Brand”为要汇总的主项数据,统计类型为“合计(Sum)”,如图所示:2.最难的部分就是总计的计算,这不能简单的用计算文本框就能解决的,于是不得不用ReportMachine 的代码来处理,也就是在总计的文本框的OnBeforePrint事件中计算之前的小计文本框的值的和,然后赋值给总计文本框显示,先看下设计的报表:红色文字为两项总计的文本框的Name属性值。
下面是ReportMachine中自定义的OnBeforePrint事件函数代码如下:unit Report;varlValue,tValue: Double;//lValue=金额总计 tValue=税额总计procedure Memo1_OnBeforePrint(Sender: TObject);beginlValue:=lValue+CalcMemo1.CalcValue; //CalcMemo1为金额小计的文本框 TRMMemoView(Sender).Memo.Text := lValue;end;procedure Memo40_OnBeforePrint(Sender: TObject);begintValue:=tValue+CalcMemo2.CalcValue;//CalcMemo2为税额小计的文本框 TRMMemoView(Sender).Memo.Text := tValue;end;procedure Main;beginMemo1.OnBeforePrint:= Memo1_OnBeforePrint; //指定金额总计的文本框的OnBeforePrint事件的处理函数Memo40.OnBeforePrint:= Memo40_OnBeforePrint;//指定税额总计的文本框的OnBeforePrint事件的处理函数end;end.上面的代码先声明了两个事件函数用于计算两个累加的总计的值,然后赋值给相应的总计文本框;然后再Main中指定给总计文本框的事件,这样当打印总计之前先汇总赋值并打印。
delphi使⽤QuickReoprt⽣成报表1.添加报表控件1>点击菜单命令‘’Componet/Install Packages‘’2>在弹出的对话框,点击Add3>在delphi⽂件夹下-bin⽬录-选择dclqrt70.dpl⽂件,点击添加安装好之后,在控件⾯板上可以找到Qreport ⾯板。
2.添加QuickRep控件创建⼀个 QuickRep1 对象。
TQuickRep控件是设置报表的核⼼控件,相当于打印范围,是其他控件的⽗级。
3.添加Adoquery1 对象1>将 QuickRep1的 DataSet 属性设置为 Adoquery1。
2>在 Adoquery1 的 SQL 属性⾥添加SQL语句。
3>设置ADOQuery1的connectstring属性为,根据实际数据库进⾏更改:Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DB;Data Source=.4>设置ACtive属性为True。
4.添加标题栏,数据栏,统计信息栏1>在 QuickRep1 上添加 3 个对象:QRBand1、QRBand2 和 QRBand32>QRBand1 主要是作为表头来显⽰头部信息。
属性:BandType 设置为:rbPageHeader3>QRBand2 主要⽤来显⽰数据记录信息。
属性: BandType 设置为:rbDetail4>QRBand3 主要⽤来存放统计信息。
BandType 设置为:rbSummary5.在数据栏中添加QRDBText1(⽂本控件)⽤来显⽰数据库信息1>DataSet 属性设置为:ADOQuery1。
2>DataField属性设置为:所需要显⽰的数据库字段.6.在统计信息栏添加统计信息属性:Data 设置为:qrsDetailCount7.添加事件在对应的按钮事件中添加如下代码:Form1.QuickRep1.Preview ;。
报表打印在数据库开发应用时,一般都离不开报表打印功能,Delphi 6.0提供了一种完善易用的打印组件---QReport,利用它可是非常方便的实现报表打印功能,这里不准备详细讨论实现报表的一切方法,具体问题已经有不少资料,不过一般的资料都是介绍的应用英美模式构造报表,这种报表格式和国内一般的习惯并不相同,下面,我们将通过一个实际的例子,说明如何构造一个符合我们习惯的报表。
有了这样的基础,实现其它样式的报表并不是太困难的事情。
一、QReport面板组件介绍QReport面板提供的组件可以分类以下几种类型:1,模板类:这类组件是作为快速构建报表的模板或容器,它实际上是QReport面板左边的前六个组件,包括QuickRep、QrsubDetall、QRStringBand、QRBand、QRChildBand、QRGroup。
其中,QuickRep是必用组件,它必须加入到一个空白的表单中,作为建立报表的基础,其它所有的组件都要放在这个组件之上。
QRBand也是一个必用组件,它用于显示具体内容,内容的类型由BandType 属性来决定。
其它几个组件的使用频率低一些,主要是构建特殊类型的报表。
2,显示一般内容的组件:这类组件主要是为了显示非数据库类型的内容,或者提供一些特定的功能,包括:QRLabel、QRExpr、QRSysData、QRMemo、QRExprMemo、QRRichText、QRShape、QRChart 等。
其中,QRExpr既可以显示一般数据,也可以显示数据库数据。
3,显示数据库内容的组件:该组件主要用于显示数据库中的数据,这些组件包括QRDBText、QRExpro、QRDBRichText、QRDBImage等。
4,其它组件:这些组件包括QRCompositeReport用于合并多个报表, QRPreview用于预览报表,至于 QRTextFilter、QRCSVFFilter、QRHTMLFilter等组件则用于输出报表内容,这些组件用的较少。
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事件中输入如下代码:beginif LINE# -1<>0and LINE# -1mod 5=0thenbeginshowBand Child1showBand band1end代码中用FastReport的内置函数 LINE# 取得当前行号,假如满足条件,就显示页头和Child3,开始新的一张表单。
delphi打印实现(节选)................{$R *.dfm}procedure SetPaperHeight(V alue:integer); //设置纸张高度-单位:mmvarDevice : array[0..255] of char;Driver : array[0..255] of char;Port : array[0..255] of char;hDMode : THandle;PDMode : PDEVMODE;beginif Value < 127 then Value := 127; //自定义纸张最小高度127mmif Value > 432 then Value := 432; //自定义纸张最大高度432mmPrinter.PrinterIndex := Printer.PrinterIndex;Printer.GetPrinter(Device, Driver, Port, hDMode);if hDMode <> 0 thenbeginpDMode := GlobalLock(hDMode);if pDMode <> nil thenbeginpDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE orDM_PAPERLENGTH;pDMode^.dmPaperSize := DMPAPER_USER;pDMode^.dmPaperLength := Value * 10;pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL;pDMode^.dmDefaultSource := DMBIN_MANUAL;GlobalUnlock(hDMode);end;end;Printer.PrinterIndex := Printer.PrinterIndex;end;procedure SetPaperWidth(V alue:integer); //设置纸张宽度:单位--mmvarDevice : array[0..255] of char;Driver : array[0..255] of char;Port : array[0..255] of char;hDMode : THandle;PDMode : PDEVMODE;beginif Value < 76 then Value := 76; //自定义纸张最小宽度76mmif Value > 216 then Value := 216; //自定义纸张最大宽度216mmPrinter.PrinterIndex := Printer.PrinterIndex;Printer.GetPrinter(Device, Driver, Port, hDMode);if hDMode <> 0 thenbeginpDMode := GlobalLock(hDMode);if pDMode <> nil thenbeginpDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE orDM_PAPERWIDTH;pDMode^.dmPaperSize := DMPAPER_USER;pDMode^.dmPaperWidth := Value * 10; //将毫米单位转换为0.1mm单位pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL;pDMode^.dmDefaultSource := DMBIN_MANUAL;GlobalUnlock(hDMode);end;end;Printer.PrinterIndex := Printer.PrinterIndex;end;//======================================绘基础几何图型函数======================//--------------------圆--------------------------------------------------------procedure _Circle(x,y,r,N:real);varIntLineWidth:Integer;beginx:=x*mm_H;y:=y*mm_V;r:=r*mm_H;IntLineWidth:=Round(N*mm_H);MyCanvas.Pen.Width:=IntLineWidth;MyCanvas.Ellipse(round(x-r),round(y-r),round(x+r),round(y+r));end;function _outTxt(x,y:Real;Txt:String;FontSize:Real;FontName:String):Boolean;varLogRec: TLOGFONT;OldFont, NewFont: HFONT;i: LongInt;begin// case PrnMode of{ 1: beginwith printer dobeginGetObject(Canvas.Font.Handle, SizeOf(LogRec), @LogRec);LogRec.lfOutPrecision := OUT_TT_ONL Y_PRECIS;LogRec.lfFaceName :='宋体';LogRec.lfHeight:=round(FontSize*mm_V);LogRec.lfWeight:=0;NewFont := CreateFontIndirect(LogRec);OldFont := SelectObject(Canvas.Handle,NewFont);end;x:=Round((x+PageLeft)*mm_H);y:=Round((y+PageTop)*mm_V);MyCanvas.TextOut(round(x),round(y),txt);end; }// 2:beginx:=Round((x+PageLeft)*mm_H);y:=Round((y+PageTop)*mm_V);MyCanvas.Font.Height:=round(FontSize*mm_V);:=FontName;MyCanvas.TextOut(round(x),round(y),txt);end;// end;end;//移动坐标点procedure _Move(x,y:Real);beginPoint1.X:=point1.X+round(x*mm_H);point1.Y:=Point1.Y+round(y*mm_V);MyCanvas.MoveTo(point1.X,point1.Y);end;procedure _line(x1,y1,x2,y2,LineWidth:Real);varpoint2:TPoint;IntLineWidth:Integer;begin// if x1+y1<>0 then_move(x1,y1); //移动到起点坐标point2.X:=Point1.X+round(x2*mm_H);point2.Y:=Point1.Y+round(y2*mm_V);IntLineWidth:=Round(LineWidth*mm_H); //输出线宽MyCanvas.Pen.Width:=IntLineWidth; //设置线宽MyCanvas.LineTo(point2.X,point2.Y);point1:=point2;end;procedure TForm1.FormCreate(Sender: TObject);varTmpQry : TADOQuery;beginMyCanvas:=Image1.Canvas;ADOCOnnection1.Connected := false;ADOConnection1.ConnectionString :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+GetCurrentDir()+'\data.mdb;Persist Security Info=False';ADOCOn:=ADOConnection1;ADOTable1.Active := true;TmpQry := OpenDB('select * from report order by ID',ADOCon);ComboBox1.Items.Clear;SetLength(TabIds,TmpQry.RecordCount);while not TmpQry.Eof dobeginComboBox1.Items.Add(VarToStr(TmpQry.FieldValues['Title']));TabIds[TmpQry.RecNo-1]:=TmpQry.FieldValues['id'];TmpQry.Next;end;if ComboBox1.Items.Count>0 then ComboBox1.ItemIndex :=0;TmpQry.Freeend;procedure recover;beginpoint1.X := round(PageLeft*mm_H);point1.Y := round(PageTop*mm_V);end;procedure _Grid(Id:Integer;Sql:String;Grid,Data:Boolean);varTmpQry,TmpQry1 : TADOQuery;x1,y1,x2,y2,r,w,FontSize:real;txt : String;classId : Integer;FontName : TFontName ; //显示使用的字体TmpColor:TColor;beginif Sql<>'' then TmpQry1 := OpenDB(sql,ADOCon);Sql := 'select * from TableLib where hidden=0 and tabId='+IntToStr(Id);if (not Grid) and (data) then sql:=sql+' and classId=4';if (grid) and (not data) then sql:=sql+' and classId<>4';TmpQry := OpenDB(Sql,ADOCon);while not TmpQry.Eof dobeginx1 := TmpQry.FieldValues['x1'];y1 := TmpQry.FieldValues['y1'];w := TmpQry.FieldValues['width'];if not TmpQry.FieldValues['relatively'] then recover; //若非相对坐村,恢复原点ClassId := TmpQry.FieldValues['ClassId'];case ClassId of1 : begin //标签txt := VarToStr(TmpQry.FieldValues['text']);if not TmpQry.FieldByName('FontSize').IsNull thenFontSize := TmpQry.FieldValues['FontSize']else FontSize := 2.5;if not TmpQry.FieldByName('FontName').IsNull thenFontName:=TmpQry.FieldValues['FontName']else FontName:='宋体';MyCanvas.Font.Style:=[];if TmpQry.FieldValues['FontBold'] thenMyCanvas.Font.Style:=[fsBold];_outTxt(x1,y1,txt,FontSize,FontName);end;2 : begin //直线x2 := TmpQry.FieldValues['x2'];y2 := TmpQry.FieldValues['y2'];_line(x1,y1,x2,y2,w);end;3 : begin //圆r := TmpQry.FieldValues['r'];_circle(x1,y1,r,w);end;4 : begin //字段if not TmpQry.FieldByName('text').IsNull thenbeginif not TmpQry1.FieldByName(TmpQry.FieldValues['text']).IsNull thenbegintxt := VarToStr(TmpQry1.FieldValues[TmpQry.FieldValues['text']]);if not TmpQry.FieldByName('FontSize').IsNull thenFontSize := TmpQry.FieldValues['FontSize']else FontSize := 2.5;if not TmpQry.FieldByName('FontName').IsNull thenFontName:=TmpQry.FieldValues['FontName']else FontName:='宋体';MyCanvas.Font.Style:=[];if TmpQry.FieldValues['FontBold'] thenMyCanvas.Font.Style:=[fsBold];TmpColor := MyCanvas.Font.Color;MyCanvas.Font.Color := clBlack;_outTxt(x1,y1,txt,FontSize,FontName);MyCanvas.Font.Color := TmpColor;end;end;end;end;TmpQry.Next;end;TmpQry.Free;end;procedure _init(PageSize:TPoint);begincase PrnMode of1: beginPhysicalWidth:=PageSize.x; //物理页宽PhysicalHeight:=PageSize.Y; //物理页高PageWidth:=printer.PageWidth; //逻辑页宽PageHeight:=printer.PageHeight; //逻辑页高end;2: beginPageWidth:=PhysicalHeight; //逻辑页宽PageHeight:=PhysicalHeight; //逻辑页高end;end;end;//---------------------------------------------------------------------------------procedure TForm1.OutPut(PrnMode:Integer;Grid,data:Boolean);varPaperW,PaperH:integer;PrintDialog1:TPrintDialog;LogRec: TLOGFONT;OldFont, NewFont: HFONT;PageSize:Tpoint;pw,ph,PointX,PointY:Integer; //纸张设置TabId : Integer;TmpQry :TADOQuery;Sql:String;beginTabId := ComboBox1.ItemIndex+1; //报表号Sql := 'select * from report where id='+IntToStr(TabId);TmpQry := OpenDb(Sql,ADOCon);if not TmpQry.Eof thenbeginPaperW := TmpQry.FieldValues['PaperWidth'];paperH := TmpQry.FieldValues['PaperHeight'];Sql := VarToStr(TmpQry.FieldValues['Sql']);if not ADOTable1.Eof thensql := _replace(sql,'@id@',VarToStr(ADOTable1.FieldValues['id']))else sql :='';PrintDialog1:=TPrintDialog.Create(nil);PageLeft := TmpQry.FieldValues['Left'];PageTop := TmpQry.FieldValues['Top'];case PrnMode of1: beginif PrintDialog1.Execute thenbeginSetPaperHeight(paperH);SetPaperWidth(PaperW);Escape(Printer.Handle, GETPHYSPAGESIZE, 0,nil,@PageSize); //取得物理页尺寸PointX:=GetDeviceCaps(Printer.Handle,LOGPIXELSX);PointY:=GetDeviceCaps(Printer.Handle,LOGPIXELSY);mm_H:=PointX/25.4;mm_V:=PointY/25.4;_Init(PageSize);Printer.Title:=VarToStr(TmpQry.FieldValues['title']);MyCanvas := Printer.Canvas;Printer.BeginDoc;MyCanvas.Brush.Color:=clBlue;MyCanvas.Brush.Style := bsclear;MyCanvas.Pen.Color:=clGreen;MyCanvas.Font.Color := clGreen;Zoom:=TmpQry.FieldValues['Zoom'];mm_H := mm_H*zoom;mm_V := mm_V*zoom;_Grid(TabId,Sql,Grid,data);Printer.EndDoc;end;end;2: beginmm_H:=2;mm_V:=2;Zoom := ComboBox2.ItemIndex+2 ; //全局缩放比例mm_H := mm_H*zoom;mm_V := mm_V*zoom;Image1.Picture.Graphic.Width := 1;Image1.Picture.Graphic.Height := 1;Image1.Width := Image1.Picture.Graphic.Width;Image1.Height := Image1.Picture.Graphic.Height;Image1.Picture.Graphic.Width := round(PaperW*mm_H);Image1.Picture.Graphic.Height := round(PaperH*mm_V);Image1.Width := Image1.Picture.Graphic.Width;Image1.Height := Image1.Picture.Graphic.Height;Image1.Top:=10-ScrollBox1.VertScrollBar.Position;if Image1.Width+10>ScrollBox1.Width thenImage1.Left:=0-ScrollBox1.HorzScrollBar.Position+2elseImage1.Left:=((ScrollBox1.Width-Image1.Width) div 2)-8-ScrollBox1.HorzScrollBar.Position;Image1.Canvas.Brush.Style := bsSolid;// ---------清除预览画布上的残像Image1.Canvas.Brush.Color:=clWhite;Image1.Canvas.Pen.Color:=clWhite;Image1.Canvas.Rectangle(0,0,PageWidth,PageHeight);Shape1.Top:=Image1.Top+10;Shape1.Left:=Image1.Left+10;Shape1.Width:=Image1.Width;Shape1.Height:=Image1.Height;Shape1.Visible:=True;Image1.Visible := true;MyCanvas.Brush.Color :=clWhite;MyCanvas.FillRect(MyCanvas.ClipRect); //清除残留影像MyCanvas:=Image1.Canvas;MyCanvas.Brush.Color:=clBlue;MyCanvas.Brush.Style := bsclear;MyCanvas.Pen.Color:=clGreen;MyCanvas.Font.Color := clGreen;Zoom:=TmpQry.FieldValues['Zoom'];mm_H := mm_H*zoom;mm_V := mm_V*zoom;_Grid(TabId,Sql,Grid,data);end;end;end;TmpQry.free;end;//-----------------------------------------------------------------------------------procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginStart_Point.X:=x;Start_Point.Y:=y;end;procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginScrollBox1.HorzScrollBar.Position:= ScrollBox1.HorzScrollBar.Position+(Start_Point.X-x); ScrollBox1.VertScrollBar.Position:= ScrollBox1.VertScrollBar.Position+(Start_Point.Y-y); end;procedure TForm1.ToolButton1Click(Sender: TObject);beginOutPut(1,checkBox1.Checked,checkBox2.Checked);end;procedure TForm1.ToolButton2Click(Sender: TObject);beginOutPut(2,checkBox1.Checked,checkBox2.Checked);end;procedure TForm1.DBEdit10Change(Sender: TObject);beginDBText1.caption := NumToChnStr(StrToFloat(DBEdit10.Text),false);end;procedure TForm1.DBEdit12Change(Sender: TObject);beginDBText2.caption := NumToChnStr(StrToFloat(DBEdit12.Text),false);end;procedure TForm1.ADOTable1BeforePost(DataSet: TDataSet);beginADOTable1.FieldValues['cn_price'] := NumToChnStr(StrToFloat(DBEdit12.Text),false); ADOTable1.FieldValues['cn_rate'] := NumToChnStr(StrToFloat(DBEdit12.Text),false); end;procedure TForm1.PageControl1Change(Sender: TObject);beginif ADOTable1.State = dsEdit then ADOTable1.Post;ToolButton2.Click;end;procedure TForm1.Shape1ContextPopup(Sender: TObject; MousePos: TPoint;var Handled: Boolean);beginend;procedure TForm1.TabSheet2ContextPopup(Sender: TObject; MousePos: TPoint;var Handled: Boolean);beginend;end.procedure PrintDbGrid(DataSet:TDataSet;DbGrid:TDbGrid;Title:String);varPointX,PointY:integer;ScreenX:integer;i,lx,ly:integer;px1,py1,px2,py2:integer;RowPerPage,RowPrinted:integer;ScaleX:Real;THeight:integer;TitleWidth:integer;SumWidth:integer;PageCount:integer;SpaceX,SpaceY:integer;RowCount:integer;beginPointX:=Round(GetDeviceCaps(printer.Handle,LOGPIXELSX)/2.54);PointY:=Round(GetDeviceCaps(printer.Handle,LOGPIXELSY)/2.54);ScreenX:=Round(Screen.PixelsPerInch/2.54);ScaleX:=PointX/ScreenX;RowPrinted:=0;SumWidth:=0;printer.BeginDoc;With Printer.Canvas dobeginDataSet.DisableControls;DataSet.First;THeight:=Round(TextHeight('我')*2.5);//设定每行高度为字符高的1.5倍SpaceY:= Round(TextHeight('我')/4);SpaceX:=Round(TextWidth('我')/4);RowPerpage:=Round((printer.PageHeight-5*PointY)/THeight); //上下边缘各2厘米ly:=2*PointY;PageCount:=0;while not DataSet.Eof dobeginif (RowPrinted=RowPerPage) or (RowPrinted=0) thenbeginif RowPrinted<>0 thenPrinter.NewPage;RowPrinted:=0;PageCount:=PageCount+1;:='宋体';Font.size:=16;Font.Style:=Font.Style+[fsBold];lx:=Round((Printer.PageWidth-TextWidth(Title))/2);ly:=2*PointY;TextOut(lx,ly,Title);Font.Size:=11;Font.Style:=Font.Style-[fsBold];lx:=Printer.PageWidth-5*PointX;ly:=Round(2*PointY+0.2*PointY);if RowPerPage*PageCount>DataSet.RecordCount thenRowCount:=DataSet.RecordCountelseRowCount:=RowPerPage*PageCount;TextOut(lx,ly,'第'+IntToStr(RowPerPage*(PageCount-1)+1)+'-'+IntToStr(RowCount)+'条,共'+IntToStr (DataSet.RecordCount)+'条');lx:=2*PointX;ly:=ly+THeight*2;py1:=ly-SpaceY;if RowCount=DataSet.RecordCount thenpy2:=py1+THeight*(RowCount-RowPerPage*(PageCount。
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编程中报表网格打印的实现
李芳萍;王俊波
【期刊名称】《铁路计算机应用》
【年(卷),期】2003(012)0z1
【摘要】通过创建对数据表的打印程序,利用对打印机画布属性的处理,实现了数据报表的网格打印.
【总页数】3页(P191-193)
【作者】李芳萍;王俊波
【作者单位】襄樊铁路分局,枝江机务段,枝江,443212;襄樊铁路分局,枝江机务段,枝江,443212
【正文语种】中文
【中图分类】TP31
【相关文献】
1.基于.NETB/S模式中水晶报表打印与套打的实现 [J], 莫丽萍
2.浅析在VFP程序中利用Excel实现报表打印功能 [J], 上官圣洁
3.利用地址调用在Excel中实现报表打印功能 [J], 香丽芸
4.VFP 9.0中实现多种自定义纸张格式的报表打印 [J], 徐小栋
5.管理信息化中水晶报表的打印与精确打印的实现 [J], 艾灵仙
因版权原因,仅展示原文概要,查看原文内容请购买。
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程序实现打印功能预备内容:一、新建一个窗体(Form1)二、在窗体上加memo1、Button1、Printdialog1这三个组件(都自带了的)。
思路过程:一、在程序代码页,最上边部分,有个粗体字Users,你在它下面加一个printers(这个不是粗体的)。
二、双击button按钮,咱要在这里写代码了。
三、先定义一个line变量,类型是integer,用来控制打印的行数。
再定义一个files为system.text,告诉程序这个东西是要它打印的文件。
四、将文件变量(files)通过assignprn函数来提交到打印机。
//可以这么理解:咱拿了个文件,命令打印机说:“呆会儿你把这个文件给我打印出来。
”五、通过rewrite函数,打开要输出的文件(files)。
//这个就理解为:打印机很无奈的拿了文件过去,翻看着。
六、设置文件(files)在打印机上的字体。
七、通过writeln函数,打印文(files)件的每行内容八、打印完了后,关闭要打印的文件。
简化过程(其实就是思路):一、在Users下写个printers二、定义两个变量。
三、通过assignprn函数把文件传到打印机上。
四、通过rewrite函数,让打印机打开文件。
五、设置字体。
六、打印每行内容七、关闭文件。
具体代码:{在Users下面加个printers}varline:integer; //定义一个line变量,用于下面控制打印各行内容files:system.text; //告诉系统说files是文本文件,是要打印机打印的文件beginif printdialog1.execute then //当printdialog1执行后beginassignprn(files); //通过assignprn函数将要打印的文件交给打印机rewrite(files); //让打印机打开文件准备打印printer.canvas.font.size:=12; //canvas是打印机的画板,用来打印文件的,直接设置字体for line:=0 to memo1.lines.count-1 do //以下是循环memo1的每个行beginwriteln(files,memo1.lines[line]); //打印每行内容 writeln(文件名,文本的某个行);end;system.close(files); //打印完了就关闭要打印的文件end;end;end;。
●南京帆软软件公司 ●商务咨询电话:86-025-5186 2240在Delphi 编程中利用Excel 实现动态报表0 引言随着计算机技术的不断普及, 办公的数字化程度越来越高, 出现了大量的计算机系统, 如固定资产管理系统、人事工资管理系统等等。
这其中存在大量的MIS 系统。
MIS 系统的一个重要特点是需要处理大量数据并形成报表。
由于行业或者其他一些原因, 这些报表的格式种类繁多, 而且还有一些复杂报表。
这些报表的格式在开发期间可能都无法设定。
为了解决这些问题, 本文采用了表格功能强大的Excel 作为报表模板, 用户可以按照自己的要求设置报表格式, 程序运行时再根据用户的设置动态填入数据, 从而实现动态报表功能。
1 实现原理先由用户按照自己的格式生成Excel 报表模板, 系统读取模板文件, 并把模板文件存入数据库, 保存用户输入的报表信息, 如某一字段填入第几行第几列。
报表打印时, 提取相应的Excel 文件, 利用Delphi 的Excel 控件填入数据库的数据, 实现动态报表功能。
2 实现过程2. 1 定义数据表系统使用MsSql Server2000数据库,定义两个表,一个是MB,用来存储报表基本信息和Excel 文件,一个是MB_Detail 存放报表的详细信息,如对应字段的行号和列号。
表结构如下:图1 MB 表结构 图2 MB _Detail 表结构MB 表中,“模板内容”字段为image 类型, 用来存储Excel 模板文件,“记录类型”字段用来表示是单张表格(只打印一条记录)还是列表(打印多条记录); MB Detail 表中的列号数据类型为char, 对应Excel 中的列号如A 、B 、C 等。
2. 2 保存和读取Excel 模板2. 2. 1 保存Excel 模板本系统将用户设置好的Excel 报表模板存入数据库“模板内容”字段。
由于本字段存储的是Excel 文件内容, 需要采用特殊的存储方式。
实验四统计程序设计与报表打印的报告课题要求:统计程序设计与报表打印按物料统计进出仓流量,计算分析流动量最小的物料。
按月份打印进出仓单表,打印进出仓单,按物料打印仓库账本。
我同样运用ADOConnection控件进行数据库的连接,ADOQuery来设置SQL语句查询。
由于前面已经建立了在xg050234_database数据库里建立了xg050234_wuliao和xg050234_iodan表,因此只要在这些表的基础上做写视图和查询便可。
当然在这个实验中,还需要另外一些控件,如DBChart1图表控件,用来显示统计进出仓流量,Qreport组件,用来显示打印的内容。
设计的思路:这个设计编写代码的较少,主要是进行一些操作,操作对了就没事,如果操作不当,系统也会出现问题,先说说下我的设计思路:首先,我是在原本的进出仓单管理模块的子菜单多添加一个仓单统计,子窗口就是利用DBChart1控件的series1来连接ADOQuery1,ADOQuery1是对进仓物料流量的查询,同样series2来连接ADOQuery2,ADOQuery2是对出仓物料流量的查询,因此在DBChart1控件的显示上会有两种颜色的柱形图,红色代表进仓物料流量,绿色代表出仓物料流量。
单单这样还是不够的,我还弄了两个label 控件,用来显示进仓最小的物料代码和出仓最小的物料代码各是什么。
我在原来的基础上,多添加了一个打印报表的模块,它的子菜单分别有打印月进出仓单表、打印进出仓单和打印库存账本。
这些都需要用到Qreport组件。
用ADOQuery设置SQL语句,让QuickRep控件与它先连接,在QuickRep控件上添加QRBand和QRGroup控件,然后分别在他们上面添加QRLabel和QRDBText控件,用来显示报表的内容。
在QRDBText控件的属性中dataset要设置为ADOQuery,datafield设置相应的表或查询字段。
用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 rzlistview report用法关于Delphi RzListView Report的用法,以下是一步一步的详细回答。
首先,我们需要了解什么是Delphi和RzListView,以及什么是Report 功能。
Delphi是一种使用Object Pascal编写的集成开发环境(IDE),由Embarcadero Technologies开发。
它是一个用于快速开发可视化桌面和移动应用程序的工具。
Delphi提供了一个可视化界面设计工具和丰富的组件库,使开发人员能够轻松地创建功能强大的应用程序。
RzListView是Delphi中的一个列表视图控件,它是在TListView基础上进行改进和扩展的。
RzListView提供了一些额外的功能和属性,使开发人员能够更方便地对列表视图进行操作和控制。
Report功能是指通过生成报表来呈现数据的功能。
报表通常以表格的形式呈现,其中包含了一系列数据以及相应的统计信息。
使用报表功能可以将数据以易读易懂的方式展示给用户,方便他们进行数据分析和决策。
在Delphi中使用RzListView控件的报表功能,我们需要按照以下步骤进行操作:第1步:准备数据在生成报表之前,我们首先需要准备好要展示的数据。
可以通过从数据库中查询数据或者手动创建一个数据集来获取数据。
确保数据集中包含了我们想要在报表中展示的所有字段。
第2步:设计报表模板一般情况下,报表都带有一个模板,定义了报表的格式和布局。
在Delphi 中,我们可以使用RzListView控件来设计报表模板。
在设计模板时,我们需要设置列表的标题、列宽和对齐方式,以及其他一些视觉效果。
可以使用RzListView的设计时属性编辑器来完成这些设置。
第3步:填充数据设计完报表模板之后,我们需要将数据填充到报表中。
可以通过遍历数据集,将每一条数据逐一添加到RzListView控件中。
在添加数据时,可以根据需要设置每个列的值,以及其他一些列相关的属性,如字体颜色、背景颜色等。
delphi打印小票源码//取得字符的高度function CharHeight:Word;varMetrics:TTextMetric;beginGetTextMetrics(Printer.Canvas.Handle, Metrics); Result : = Metrics.tmHeight;end;//file://取得字符的平均宽度function AvgCharWidth:Word;varMetrics:TTextMetric;beginGetTextMetrics(Printer.Canvas.Handle, Metrics); Result : = Metrics.tmAveCharWidth;end;//file://取得纸张的物理尺寸---单位:点function GetPhicalPaper: TPoint;varPageSize :TPoint;begin//file://PageSize.X;纸张物理宽度-单位:点//file://PageSize.Y;纸张物理高度-单位:点Escape(Printer.Handle, GETPHYSPAGESIZE, 0,nil,@PageSize);Result := PageSize;end;//file://2.取得纸张的逻辑宽度--可打印区域//file://取得纸张的逻辑尺寸function PaperLogicSize:TPoint;varAPoint:TPoint;beginAPoint.X := Printer.PageWidth;APoint.Y := Printer.PageHeight;Result := APoint;end;//file://纸张水平对垂直方向的纵横比例function HVLogincRatio: Extended;varAP:TPoint;beginAp := PaperLogicSize;Result := Ap.y/Ap.X;end;//file://取得纸张的横向偏移量-单位:点function GetOffSetX: Integer;beginResult := GetDeviceCaps(Printer.Handle, PhysicalOffSetX);end;//file://取得纸张的纵向偏移量-单位:点function GetOffSetY: Integer;beginResult := GetDeviceCaps(Printer.Handle, PhysicalOffSetY);end;//file://毫米单位转换为英寸单位function MmToInch(Length:Extended):Extended;beginResult := Length/25.4;end;//file://英寸单位转换为毫米单位function InchToMm(Length:Extended):Extended;beginResult := Length*25.4;end;//file://取得水平方向每英寸打印机的点数function HPointsPerInch: Integer;beginResult := GetDeviceCaps(Printer.Handle, LOGPIXELSX);end;//file://取得纵向方向每英寸打印机的光栅数function VPointsPerInch: Integer;beginResult := GetDeviceCaps(Printer.Handle, LOGPIXELSY) end;//file://横向点单位转换为毫米单位function XPointToMm(Pos:Integer):Extended;beginResult := Pos*25.4/HPointsPerInch;end;////file://纵向点单位转换为毫米单位function YPointToMm(Pos: Integer): Extended;beginResult := Pos*25.4/VPointsPerInch; end;//file://设置纸张高度-单位:mmprocedure SetPaperHeight(Value: integer); varDevice :array[0..255] of char;Driver :array[0..255] of char;Port :array[0..255] of char; hDMode : THandle;PDMode :PDEVMODE;begin//file://自定义纸张最小高度127mmif Value < 127 then Value := 127;//file://自定义纸张最大高度432mmif Value > 432 then Value := 432;Printer.PrinterIndex := Printer.PrinterIndex;Printer.GetPrinter(Device, Driver, Port, hDMode); if hDMode <> 0 thenbeginpDMode := GlobalLock(hDMode);if pDMode <> nil thenbeginpDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE or DM_PAPERLENGTH;pDMode^.dmPaperSize := DMPAPER_USER;pDMode^.dmPaperLength := Value * 10;pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL; pDMode^.dmDefaultSource := DMBIN_MANUAL;GlobalUnlock(hDMode);end;end;Printer.PrinterIndex := Printer.PrinterIndex;end;//file://设置纸张宽度:单位--mmProcedure SetPaperWidth(Value: integer);varDevice :array[0..255] of char;Driver :array[0..255] of char;Port :array[0..255] of char; hDMode :THandle;PDMode :PDEVMODE;begin//file://自定义纸张最小宽度76mm if Value < 76 then Value := 76;//file://自定义纸张最大宽度216mm if Value > 216 then Value := 216;Printer.PrinterIndex := Printer.PrinterIndex;Printer.GetPrinter(Device, Driver, Port, hDMode); if hDMode <> 0 thenbeginpDMode := GlobalLock(hDMode);if pDMode <> nil thenbeginpDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE orDM_PAPERWIDTH;pDMode^.dmPaperSize := DMPAPER_USER;//file://将毫米单位转换为0.1mm单位pDMode^.dmPaperWidth := Value * 10;pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL; pDMode^.dmDefaultSource := DMBIN_MANUAL;GlobalUnlock(hDMode);end;end;Printer.PrinterIndex := Printer.PrinterIndex;end;//file://在(Xmm, Ymm)处按指定配置文件信息和字体输出字符串procedure TFrmADDHYXF.PrintText(X,Y:Extended;Txt:string;ConfigFileName:string;FontSize:Integer=12);varOrX, OrY:Extended;Px, Py:Integer;AP:TPoint;Fn:TStrings;FileName:string;OffSetX, OffSetY:Integer;begin//file://打开配置文件,读出横向和纵向偏移量tryFn := TStringList.Create;FileName := ExtractFilePath(Application.ExeName) + ConfigFileName; if FileExists(FileName) thenbeginFn.LoadFromFile(FileName);//file://横向偏移量OffSetX := StrToInt(Fn.Values['X']);//file://纵向偏移量OffSetY := StrToInt(Fn.Values['Y']);endelsebegin//file://如果没有配置文件,则生成Fn.Values['X'] := '0';Fn.Values['Y'] := '0';Fn.SaveToFile(FileName); end;finallyFn.Free;end;X := X + OffSetX;Y := Y + OffSetY;// file://因为是绝对坐标,因此,不用换算成相对于Y轴坐标Py := Py - GetOffSetY;Px := Px + 2 * AvgCharWidth;/doc/12de34a4001ca300a6c30c225901020 20640f2e9.html := 'xx';Printer.Canvas.Font.Size := 8;//file://Printer.Canvas.Font.Color := clGreen;Printer.Canvas.TextOut(Px, Py, Txt);end;例子:writeln(F,'');PrintText(-3, kuang, trim(‘’), 'config.txt');PrintText(13, kuang, trim(‘’), 'config.txt');PrintText(20, kuang, trim(‘’), 'config.txt');PrintTex t(30, kuang, trim(‘’), 'config.txt'); PrintText(37, kuang, trim(‘’), 'config.txt');。
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里自带有打印相关控件吗?怎么实现呀?打印dagrid表内容,或者说memo,Listbox,或者几个edit的内容。
谢谢uses printersvarlines:integer;prntext:system.text;beginif printdialog1.execute thentryassignprn(prntext); //将PRNTEST分配给打印机rewrite(prntext); //调用REWRITE函数,为输出打开已分配的文件printer.canvas.font:=memo1.font;//把当前MEMO1的字体指定给打印对象的CANVAS的字体属性for lines:=0 to memo1.lines.count-1 dobeginwriteln(prntext,memo1.lines[lines]);end;//把MEMO的内容写到打印机对象system.close(prntext); //关闭打印文件exceptabort;end;end;=====================在网上看到好多第三方的打印控件我想问ReportBuilderReportMachineQuickReportFastReport这几种打印控件的优缺点哪个最好用,哪个并发简单快捷?这些都是报表工具,用来制作报表的,偶们公司现正在用FastReport,感觉还凑合,虽然有不少Bug,但是都还可以通过其它方法解决或避免。
听网友们说QuickReport还像还可以,但是说实话,这些由国外开发的报表工具有时候你会发现并不适合国内的需求,很令人郁闷,所以无论使用哪一个,都要有被其郁闷的心理准备。
话又说回来,用这种东西,必需要有钻研精神,hoho,这样才能更快更好的掌握其特点和使用方法,遇到的问题也就迎刃而解了===============================1.用Delphi编写打印程序的窍门如果你想自己用Delphi编写一个打印程序,那么,下面这些技巧或许对你有所帮助。
delphi里自带有打印相关控件吗?怎么实现呀?打印dagrid表内容,或者说memo,Listbox,或者几个edit的内容。
谢谢
uses printers
var
lines:integer;
prntext:system.text;
begin
if printdialog1.execute then
try
assignprn(prntext); //将PRNTEST分配给打印机
rewrite(prntext); //调用REWRITE函数,为输出打开已分配的文件
printer.canvas.font:=memo1.font;
//把当前MEMO1的字体指定给打印对象的CANVAS的字体属性
for lines:=0 to memo1.lines.count-1 do
begin
writeln(prntext,memo1.lines[lines]);
end;
//把MEMO的内容写到打印机对象
system.close(prntext); //关闭打印文件
except
abort;
end;
end;
=====================
在网上看到好多第三方的打印控件
我想问
ReportBuilder
ReportMachine
QuickReport
FastReport
这几种打印控件的优缺点
哪个最好用,哪个并发简单快捷?
这些都是报表工具,用来制作报表的,偶们公司现正在用FastReport,感觉还凑合,虽然有不少Bug,但是都还可以通过其它方法解决或避免。
听网友们说QuickReport还像还可以,但是说实话,这些由国外开发的报表工具有时候你会发现并不适合国内的需求,很令人郁闷,所以无论使用哪一个,都要有被其郁闷的心理准备。
话又说回来,用这种东西,必需要有钻研精神,hoho,这样才能更快更好的掌握其特点和使用方法,遇到的问题也就迎刃而解了
===============================
1.用Delphi编写打印程序的窍门
如果你想自己用Delphi编写一个打印程序,那么,下面这些技巧或许对你有所帮助。
1.获取显示当前打印机的分辨率
Windows下的打印分辨对打印程序有着至关重要的作用,如果你想知道打印机的分辨率,请在程序中加入一行:Show Message(+inttostr(GetDeviceCaps(printer.Handle,LOGPIXELSX))+chr(13)++inttostr(Ge tDeviceCaps(printer.Handle,LOGPIXELSY)));结果就一目了然了。
2.将结果直接送到打印机
Delphi提供了两种打印方式:一是将结果输送到Form,再调用Form的print方法将结果输送到打印机,二是将结果直接输送到打印机。
如果你采用第一种方式,则无论你怎样调整Form的PrintScal属性,打印出来的东西也不会让你满意。
因此建议采用第二种方式。
3.尽量不要使用AssignPrn
尽管AssignPrn简化了文本打印操作,使输出到打印机像输出到文件一样简单。
但简单带来的是一系列的不方便:你无法知道当前打印的行数,无法准确控制行距,无法灵活改变字体字形等等。
还是用打印机的Canvas属性进行打印吧。
4.用打印机的点数做度量单位
如果想让打印程序在任何打印机上都能正常地打印,你就必须改变你的度量单位。
如果采用固定的度量,不同分辨率的打印效果是不同的。
举例来讲:printer.Canvas.rectangle(0,0,360,720)在360×360的佳能4200SP上能打出一个1英寸宽、2英寸高的矩形,但在600×600的惠普6L上只能打出0.6英寸宽、1.2英寸高的矩形。
使用打印机的点数做为度量单位是一个明智的选择。
具体做法如下:VarPointX,PointY:integer;PointX:=GetDeviceCaps(printer.Handle,LOGPIXELSX);PointY :=GetDeviceCaps(printer.Handle,LOGPIXELSX);printer.Canvas.rectangle(0,0,PointX*1 ,PointY*2)这样,无论你使用什么样的打印机,都能得到一个1英寸宽、2英寸高的矩形。
5.添加打印程序单元
尽管Delphi在生成窗体时会自动在USES部分加入许多程序单元,但打印程序单元(Printers)却不在之列,要想使打印机正常工作和程序不出错,你还是老老实实手工给它加上吧。
(湖北杨德军)。