哪位能给个打印发票的例子程序,能下载的连接也可以。[email protected]

解决方案 »

  1.   

    打印发票,DELHI很容易实现,用得着写那么的原代码吗,难道DELPHI的RAVE报表和以前的REPORT
    控件白提供了吗..........
    .............抗议................
      

  2.   

    mxh78(mxh78)请你给个简单的例子,另外我想要一个demo,麻烦各位了。
      

  3.   

    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);
      

  4.   

    //打印浙江门诊发票中空白的文字
        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;