哪位能给个打印发票的例子程序。

junjie_zhao_2001 2003-07-23 07:35:05
哪位能给个打印发票的例子程序,能下载的连接也可以。dz-zjj@163.net
...全文
140 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
星星 2003-07-25
  • 打赏
  • 举报
回复
//打印浙江门诊发票中空白的文字
Printer.Canvas.TextOut(VOffsetx+120,VOffsety+460,SysDM.GetSysParam(pkOut_InvoiceEmptyFormat1));
Printer.Canvas.TextOut(VOffsetx+105,VOffsety+560,SysDM.GetSysParam(pkOut_InvoiceEmptyFormat2));

//打印单据日期
Printer.Canvas.Pen.Width:=2;
Printer.Canvas.Ellipse(VOffsetx+500,VOffsety+10,VOffsetx+700,VOffsety+110);
Printer.Canvas.Font.Size:=8;

Printer.Canvas.TextOut(VOffsetx+510,VOffsety+40,vHosTiTle);//'临安市昌化人民医院');
Printer.Canvas.TextOut(VOffsetx+510,VOffsety+60,' '+vSignTiTle);//' 门诊收费专用章 ');
Printer.Canvas.Font.Size:=11;
Printer.Canvas.TextOut(VOffsetx+350,VOffsety+160,vDate);

vHeJi:=FormatFloat('0.00',QryPrint1.FieldByName('yingShouJE').AsFloat);
ShareFunc.CapitalizeMoney(abs(StrToFloat(vHeJi)),false,vPrintHeJi);
IntHeJi:=IntToStr(trunc(abs(StrToFloat(vHeJi))));
for i:=0 to 3-Length(IntHeJi) do
vPrintHeJi:='零 '+vPrintHeJi;
//打印大写合计金额
if StrToFloat(vHeJi)<0 then Printer.Canvas.TextOut(VOffsetx+255,VOffsety+600,'负'+vPrintHeJi)
else Printer.Canvas.TextOut(VOffsetx+225,VOffsety+600,vPrintHeJi);

//4打印备注信息 modified by sunly 2002-11-7
// Printer.Canvas.TextOut(600,680,SysDM.GetSysParam(pkOut_InvoiceMemoInfo));
Printer.Canvas.TextOut(VOffsetx+800,VOffsety+950,SysDM.GetSysParam(pkOut_InvoiceMemoInfo));
//1打印收款人
//Printer.Canvas.TextOut(110,730,QryPrint1.FieldByName('ShouKuanYBM').AsString);
Printer.Canvas.TextOut(VOffsetx+200,VOffsety+840,QryPrint1.FieldByName('ShouKuanYBM').AsString);
//打印医保费用分类
Printer.Canvas.TextOut(VOffsetx+450,VOffsety+660,vGeRenZH);
Printer.Canvas.TextOut(VOffsetx+450,VOffsety+710,vZhangHuYE);
Printer.Canvas.TextOut(VOffsetx+450,VOffsety+760,vXiangJinZF);
Printer.Canvas.TextOut(VOffsetx+450,VOffsety+810,vZiFeiFY);

//3打印开单医生编码
Printer.Canvas.font.size:=9;
Printer.Canvas.TextOut(VOffsetx+340,VOffsety+870,'医生编码: '+vDocID);
Printer.Canvas.font.size:=11;
//5打印小写合计金额
Printer.Canvas.TextOut(VOffsetx+800,VOffsety+840,vHeJi);

//打印核算项目
with QryPrint4 do
begin
while not Eof do
begin
vX:=FieldByName('ZuoBiaoX').AsInteger;
vY:=FieldByName('ZuoBiaoY').AsInteger;
if FieldByName('JinE').AsFloat=0 then
Printer.Canvas.TextOut(VOffsetx+vX,VOffsety+vY,'')
else
Printer.Canvas.TextOut(VOffsetx+vX,VOffsety+vY,FormatFloat('0.00',FieldByName('JinE').AsFloat));
QryPrint4.Next;
end;
end;
Printer.Canvas.font.size:=9;
//打印药品及费用明细
//Printer.Canvas.TextOut(580,170,'收费项目 数量 单价 金额 收费项目 数量 金额');
Printer.Canvas.TextOut(VOffsetx+1050,VOffsety+75,'单价');
// Printer.Canvas.TextOut(580,190,'--------------------------------------------');


Y := 110;
xh:=1;
while not QryPrint3.Eof do
begin
//打印序号
printer.canvas.textout(VOffsetx+655,VOffsety+Y,InttoStr(xh));
//打印药名
Printer.Canvas.TextOut(VOffsetx+680,VOffsety+Y,QryPrint3.FieldByName('YaoMing').AsString);
//打印规格
Printer.canvas.Textout(VOffsetx+820,VOffsety+Y,QryPrint3.FieldByName('GuiGe').AsString);
//打印单位
Printer.Canvas.TextOut(VOffsetx+870,VOffsety+Y,QryPrint3.FieldByName('danwei').AsString);
Printer.Canvas.TextOut(VOffsetx+1050,VOffsety+Y,QryPrint3.FieldByName('danjia').AsString);
//打印数量
Printer.Canvas.TextOut(VOffsetx+1100,VOffsety+Y,FormatFloat('0',QryPrint3.FieldByName('ShuLiang').AsFloat));//+Copy(QryPrint3.FieldByName('DanWei').AsString,0,2));
//Printer.Canvas.TextOut(850,Y,FormatFloat('0.00',QryPrint3.FieldByName('ShuLiang').AsFloat));
//打印单价
// Printer.Canvas.TextOut(VOffsetx+1050,VOffsety+Y,QryPrint3.FieldByName('danjia').AsString);
//打印金额
Printer.Canvas.TextOut(VOffsetx+1170,VOffsety+Y,FormatFloat('0.00',QryPrint3.FieldByName('JinE').AsFloat));
//打印比例
Printer.Canvas.TextOut(VOffsetx+1250,VOffsety+Y,FormatFloat('0.00',QryPrint3.FieldByName('ZiLiBL').AsFloat));
QryPrint3.Next ;
Y := Y + 25;
xh:= xh + 1;
end;

Printer.EndDoc;
end;

end;
星星 2003-07-25
  • 打赏
  • 举报
回复
1、定义发票项目坐标表,发票项目、项目编号、X坐标、Y坐标
2、以前做HIS项目中的部分发票打印代码,用Printer.Canvas.TextOut;

procedure TUserDM.PrintInvoice(aDanJuID:string);
var
vYear,vMonth,vDay:Word;
PDevice,PDriver,pPort:Array[0..255] of Char;
hDMode:THandle;
PDMode:PDeviceMode;
vDate,vHeJi,vPrintHeJi:string;
X,Y,vX,vY,xh,vOffsetx,vOffsetY:integer;
i:integer;
IntHeJi:string;
vDocID,vHosTiTle,vSignTiTle:string;
vGeRenZH,vZhangHuYE,vXiangJinZF,vZiFeiFY:String;
begin
//发票汇总信息
QryPrint1.Close;
QryPrint1.ParamByName('DanJuID').AsString:=aDanJuID;
QryPrint1.Open;

//发票药品及费用明细
QryPrint3.Close;
QryPrint3.ParamByName('DanJuID').AsString:=aDanJuID;
QryPrint3.Open;

//取得医生编码
with SysDM.qryfree do
begin
close;
sql.clear;
sql.add(' select a.YiShengBM ');
sql.add(' from Out_Recipe a,Out_RecipeDetail b ');
sql.add(' where a.JiuZhenID=b.JiuZhenID and
a.ChuFangLH=b.ChuFangLH ');
sql.add(' and b.DanJuID=:DanJuID');
parambyname('DanJuID').asstring:=aDanJuID;
open;
vDocID:=FieldByName('YiShengBM').asstring;

Close;
Sql.Clear;
Sql.Add('SELECT XianJinZF, DangNianZF + LiNianZF AS ZhangHuZF,');
Sql.Add(' Temp11+Temp12-abs(DangNianZF + LiNianZF) AS ZhangHuYE,ZiFeiFY');
Sql.Add(' FROM Z_Out_Charge where DanJuID=:DanJuID');
parambyname('DanJuID').asstring:=aDanJuID;
open;
if IsEmpty then Raise Exception.Create('没有相关的结算信息,请通知管理员');
vGeRenZH:=FieldByName('ZhangHuZF').AsString;
vZhangHuYE:=FieldByName('ZhangHuYE').AsString;
vXiangJinZF:=FieldByName('XianJinZF').AsString;
vZiFeiFY:=FieldByName('ZiFeiFY').AsString;
end;

if SysDM.GetSysParam(pkSys_BillVersion)=1 then //浙江省
begin
VOffsetx:=SysDM.GetSysParam(pkOut_InvoiceOffset_x); //取发票水平偏移量
VOffsetY:=SysDM.GetSysParam(pkOut_InvoiceOffset_y); //取发票垂直偏移量
vHosTiTle:=SysDM.GetSysParam(pkSys_HospName); //取医院名称 vchangHua
vSignTiTle:=SysDM.GetSysParam(pkOut_InvoiceSignTiTle);//取公章标题 vchangHua
//浙江核算项目
QryPrint4.Close;
QryPrint4.ParamByName('DanJuID').AsString:=aDanJuID;
QryPrint4.Open;
//获得打印机的DeviceMode结构句柄
Printer.GetPrinter(pDevice,pDriver,pPort,hDMode);
//如果句柄为0,表示打印机没有装载
if hDMode=0 then
begin
Printer.PrinterIndex :=Printer.PrinterIndex ;
Printer.GetPrinter(pDevice,pDriver,pPort,hDMode);
end;
if hDMode<>0 then
begin
//根据TDeviceMode的句柄获得指向该结构的指针变量
PDMode:=GlobalLock(hDMode);
if PDMode<>Nil then
with PDMode^ do
begin
DMFields:=DMFields Or DM_PAPERLENGTH;
dmPaperLength:=1520;//设置打印页长 152
dmFields:=dmFields or DM_PAPERWIDTH;
dmPaperWidth:=1920;//设置打印页宽
end;
GlobalUnLock(hDMode);//解锁,释放内存
Printer.PrinterIndex :=Printer.PrinterIndex ;
end;
Printer.Canvas.font.name:='宋体';
Printer.BeginDoc;//开始打印
Printer.Canvas.font.size:=11;
DecodeDate(QryPrint1.FieldByName('DanJuRQ').AsDateTime, vYear, vMonth, vDay);
vDate:=' '+IntToStr(vYear)+' '+IntToStr(vMonth)+' '+IntToStr(vDay);
//打印病人姓名
Printer.Canvas.TextOut(VOffsetx+170,VOffsety+160,QryPrint1.FieldByName('XingMing').AsString);

//打印发票号
Printer.Canvas.TextOut(VOffsetx+350,VOffsety+840,'No. '+QryPrint1.FieldByName('DanJuID').AsString);
//打印病人类别
Printer.Canvas.TextOut(VOffsetx+170,VOffsety+115,QryPrint1.FieldByName('LeiBieMC').AsString);

我是:程序猿 2003-07-24
  • 打赏
  • 举报
回复
打印发票,DELHI很容易实现,用得着写那么的原代码吗,难道DELPHI的RAVE报表和以前的REPORT
控件白提供了吗..........
.............抗议................
junjie_zhao_2001 2003-07-24
  • 打赏
  • 举报
回复
mxh78(mxh78)请你给个简单的例子,另外我想要一个demo,麻烦各位了。
姓 名: 周方勇 网 名: 长江支流/咏方舟 Email: flygoldfish@sina.com.cn Blog: http://blog.csdn.net/flygoldfish 2004年04月18日 1、在网友的热心支持下免费提供空间和域名 www.webmis.com.cn 2004年04月07日 发布不带.dll的源码供交流 2005年01月24日 1、提供VB.NET及C#的使用示例工程 2、发布V2.2测试版 2005年01月22日 将打印示例程序按功能(简单打印、完整示例、Excel打印)分在不同的窗口 2005年01月14日 发布《MIS金质打印通》 V2.1测试版 2004年01月13日 1、将MisPrinter类改为MisGoldPrinter,以促进品牌效应。 2、在MisGoldPrinter类中再增加一个带参构造函数,以便直接默认横向打印/预览 3、增加DocumentName属性,以便在打印/预览时在窗口标题栏中显示指定的名称 2004年01月07日 调整打印程序内部结构,为使发出去的后期源程序版本一致,待近期调整完结构之后公布源码! 这就是继V1.1之后没有发源代码的原因。 ____________________________________________________ 2004年7月 完成了整体的框架、涉及打印的几个对话框、核心打印程序及几个基本打印对象并由BillPrinter类将其组织起来,程序基本定型。 本程序为通用打印程序,单据、会计凭证、发票清单、报表、任意复杂表格、合并表格如工矿企业合同都可以由系统提供的几个默 认打印对象组合打印。 DataGrid、DataTable、MSHFlexGrid等二维形式全部可以打印。 部分对象如PrinterMargins、Sewing、GridLineFlag、GridMergeFlag等提供图例,以促进理解。 后期版本将提供XML描述、SQL数据源的打印,并用管理器管理任意多个网格、文本对象、图象等,用户可以随意定义。 2004年8月初 为一些类或程序写上注释,如下: /// 程序提供:周方勇;Email:flygoldfish@sina.com。 /// 请 关 注:WebMIS.Net快速开发工具,不写一行程序开发B/S架构下MIS、OA、CRM、人事管理、档案管理等数据库网页系统。简单、实用、稳定、可靠。 /// 下 载: /// 上海奥联:WWW.AlinkSoft.COM /// 用友华表:WWW.CellSoft.CC ///★★★★★您可以免费使用此程序,但是请您保留此说明,以维护知识产权★★★★★ 2004年08月07日 1、将框架作了部分调整,并且将打印基本对象的基类Printer作了调整。 由于打印对象的定位及打印区域受PrintDocument、Sewing影响,为了方便Printer的子类不必在每次实例化后设置这 两个对象,故将PrintDocument、Sewing放在一个类中作为全局静态变量,现删除这两个全局静态变量, 改在Printer 的构造函数中,为每个子类提供一个默认的PrintDocument、Sewing实例对象。 2、为GridBase扩充了几个属性与方法,由于字段太多,每次增加或修改字段后要去构造函数中去修改他们的初始化, 太麻烦了,所以将它们的初始化直接放在定义处,并把相应的属性及相关方法直接放在字段后,并用#region指令将 它们折叠起来,便于维护。 3、增加了ReDimArrString(string[,] arrStr,int rows,int cols),即重定义二维字符数组,因为网格的行列数可能要改 变,但不能因为它们改变了而丢失原有的数据,因此写此程序保留新定义的行列,但保留和原有行列数相交的部分数据。 4、应用设计模式原理重新组织IPrinterPageSetting、PrinterPageSetting、WinPrinterPageSetting、WebPrinterPageSetting。 WebPrinterPageSetting待进一步完善。 2004年08月08日 1、将以往程序优化 2、将DrawGrid类中DrawGridLine(...)、DrawGridText(...)、DrawGridBorder(...)参数最全的核心函数改为protected,提供public的 无参方法供实例化对象调用; 由于在指定的区域内可能绘制不完网格,因此上面的几个函数可能会将返回类型void改为一个描述绘制结果的对象; SetText(int row,int col,string text)、SetText(int row,int col)将在后期版本中提供.Row[index].Text的属性; TransGrid()、ResetTransGrid()是在设计时为了能做任意的缩放的变换提供的,待进一步完善。 3、对Printer类中的ReSetVariableVal()、GetPrinterMargins()进行修改,以适应对纸张进行调整特别是横向、竖向打印的支持。 2004年08月09日 1、解决分页问题,主要是有些对象每页都重复打印,使得条件复杂。 2004年08月10日 1、13:42将源程序传给资深程序员李峰; 2、计划增加每页小计。 2004年08月11日 1、为网格增加画对角线的功能,以满足中国人表格的特点; 2、将Graphics、PrintDocument、Sewing、RectangleF、Height、Draw()重新组织在IDraw里,并在 BillPrinter中增加private void OutObject(IDraw outer),使每个对象输出时调用此方法,提高代码重用率; 2004年08月14日 1、忘了,反正又把程序看了看,修修补补做了些调整。 2004年08月15日 1、将分页又重新简化了一下,主要是打印Body上用了数据行指针; 2004年08月16日 1、发布V1.0源码版,程序名称为MIS金质打印王。 2、在CSDN上发布贴子: .^^.开源:C#.NET开发的MIS打印程序,各种网格如DataGrid打印、DataTable、HtmlTable等二维形式全搞定,源码免费下载 http://community.csdn.net/Expert/topic/3278/3278050.xml?temp=.5012934 2004年08月17日 1、在CSDN上发布文章: 开源:.NET环境下有关打印页面设置、打印机设置、打印预览对话框的实现 http://blog.csdn.net/flygoldfish/archive/2004/08/17/77208.aspx 2、应广大网友来信要求,计划将PrinterPageSetting目录开源到演示程序,以后逐一以文章的形式全部开放。 2004年08月18日 1、中国共享软件网收录 MIS金质打印王 V1.0源码版 http://www.shareware.cn/pub/2319.html 2、将PrinterPageSetting目录即(页面设置、打印机设置、打印预览)源码加入演示程序。 3、在MisGoldPrinter中添加属性,DataSource,这样,仅需几句话就可以打印了,如: MisGoldPrinter webmis = new MisGoldPrinter(); //申明并实例化打印组件 webmis.Title = "WebMIS.Net快速开发工具\nWWW.AlinkSoft.COM"; //网格标题 webmis.DataSource = this.dataGrid1; //DataGrid作为数据源 webmis.Preview(); //打印预览 注意:将将MisGoldPrinter中的Draw(Graphics g)打印各个对象时加一下 printerobject != null的判断,如 if (mCurrentPageIndex == 1 || _caption.IsDrawAllPage)... 改为 if (_caption != null && (mCurrentPageIndex == 1 || _caption.IsDrawAllPage))... 否则可能会出错。 4、将3的应用加到了frmPrint.cs ,做一个简单的打印。 2004年08月19日 1、将PrinterPageSetting目录即(页面设置、打印机设置、打印预览)源码加入演示程序。 2、发布V1.1源码版,程序名称为MIS金质打印王。 2004年09月03日 1、由于在CSDN上发表文档".NET环境下有关打印页面设置、打印机设置、打印预览对话框的实现", 因此将PrinterPageSetting封装成一个.dll,分别用C#与VB.net写了使用示例工程程序 2、在IPrinterPageSetting.cs增加event PrintPageDelegate PrintPage,并将原PrintPage改为PrintPageValue /// C#调用: /// PrinterPageSetting1.PrintPageValue = new PrintPageDelegate(this.PrintPageEventHandler); ///或 PrinterPageSetting1.PrintPage += new PrintPageDelegate(this.PrintPageEventHandler); /// VB调用: /// Me.printerPageSetting.PrintPageValue = New GoldPrinter.PrintPageDelegate(AddressOf printDocument_PrintPage) 3、增加了DrawText类,用以打印文档(其实可以用一行一列的DrawGrid打印) 4、PrinterPageSetting的readme.txt如下: ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 声明: 1、版权归周方勇所有,如需传播,请保留完整的内容及此声明,以维护知识产权! 2、您可以使用本程序中的任何部分作为学习或商业用途,但是需要保留相关程序的注释。 3、最新版本下载:http://www.alinksoft.com 4、免费源码 5、本人不承担任何责任。 周方勇;Email:flygoldfish@sina.com。 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 本程序带C#与VB.net版本使用方式,用VS.net打开PrinterPageSetting.sln, 在您喜欢的语言项目上单击鼠标右键,在弹出的菜单中选择"设为启动项目",然后运行。 5、准备独立发布PrinterPageSetting 2004年09月04日 重大喜讯:收到中国共享软件注册中心2004年09月03日的邮件。部分内容如下: 软件名称:MISGoldPrinter免费C#.NET源码版(5块钱给softreg吧) 注册价格:5元/套 您的软件在本站的编号是: /535AC7A1-9985-4314-A52C-978BB9C0BB29/ 软件注册页绝对链接: http://www.softreg.com.cn/shareware_view.asp?id=/535AC7A1-9985-4314-A52C-978BB9C0BB29/ 快捷链接: http://www.softreg.com.cn/shareware.asp?id=17260 2004年10月...日 改变PrintDocument的DefaultPageSettings就会改变PrinterMargins。由于是打印基类,继承者博多,因此 每次实例化时都会计算PrinterMargins会影响效率,这就是前些版本速度慢的原因。改为手动调用CalculatePageInfo()或改变 PrintDocument后在调用处重新计算一个PrinterMargins保存起来,因此增加PrinterSingleton, 使系统只有同一个PrintDocument及PrinterMargins,这样速度大大改观。 开发Excel打印功能 2004年11月20日 开发Excel打印功能完成,能够生成Excel文件、Excel打印预览、Excel操作。 自定制模板打印,非常灵活。完成各种打印、套打、报表、图表分析。 2004年11月23日 发布MIS金质打印王 V2.0测试版。如需要源码,下载V1.1即可。 V2.0源码版在预计在12月上旬推出。 2004年11月27日 改正预览时显示正确,在预览窗口单击打印时打印不出Body的错误。 其实只要在PrintPageEventHandler()中打印或预览重置当前页及当前行 this.mCurrentPageIndex = 1; this.mCurrentRowIndex = 0; 2004年12月...日 1、调整打印程序内部结构,公开部分程序基本没动,只作相应的错误更正及加几个属性。 2、PrinterBase不再包含装订线Sewing,打印对象的定位及打印区域只受PrintDocument的影响, 3、由于使用PrinterSingleton使系统只有同一个PrintDocument及PrinterMargins,因此在同一系统 两个地方使用时出现了打印一样的效果,如A处有header而B处没有,先打A再打B,结果B中也有header了, 于是在PrinterSingleton增加Reset()方法以使PrintDocument及PrinterMargins为null,在MisPrinter 构造函数中首先调用Reset()
有过编程经验的人都知道,编写打印模块是非常头疼的事,本组件针对上述情况,作者根据自已在软件开发过程中积累的经验编制了一个通用的打印组件(ActiveX DLL),这个组件可用于软件开发中的打印模块的二次开发,它可实现1毫米精度的定位打印,可以完成各种类型报表的设计并打印,支持表格打印、多页打印、资料发票套打等。组件提供的接口允许程序员控制设计的打印模板中的各个对象的属性,在程序中就可以完成所在的数据处理,支持数据的合计值、平均值等操作。提供了打印定位微调等接口控制(软件用户自己就可以不同的打印机设置微调值,避免了常规要由程序员上门调试打印位置,有时还要根据不同的打印机更改源码的麻烦),实现对各种纸张及票据的精确定位打印,支持的打印对象除了文本文字以外,还支持直线、矩形、圆、填充矩形、填充圆、图象等的打印。 该组件库内嵌的打印预览功能,随时可以将程序对报表处理的情况进行实时预览。组件库内嵌的报表模板设计器,可以方便快速的设计出各种类型报表的模板,设计过程采用先进的所见即所得的方式,让您使用起来更加得心应手,报表可以由程序员设计也可以交由用户自己设计, 该组件支持VB、VC等开发工具,并提供了相关的示例工程源代码。 作者:罗伟 Email:mr_luowei@163.com

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧