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

junjie_zhao_2001 2003-07-23 07:35:05
哪位能给个打印发票的例子程序,能下载的连接也可以。dz-zjj@163.net
...全文
146 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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,麻烦各位了。

5,928

社区成员

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

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