有那位兄弟可提供一实现票据打印的源程序来看看啊
我现在要作这部分
但我对打印机的打印实现部分是一点资料都没有
先谢了

解决方案 »

  1.   

    最简单的就是用QuickReport了,参照例程,很容易的
      

  2.   

    是不是套打,如果套打的话,用textout还是比较准的。
      

  3.   

    发票应该是套打吧,用quickreport只要把要打印的项目位置方好了就行了,
    要用尺量的。
      

  4.   

    发票应该是套打吧,用quickreport只要把要打印的项目位置方好了就行了,
    要用尺量的。
      

  5.   


    file://设置纸张高度-单位:mmprocedure SetPaperHeight(Value:integer);var Device : array[0..255] of char; Driver : array[0..255] of char; Port : array[0..255] of char; hDMode : THandle; PDMode : PDEVMODE;beginfile://自定义纸张最小高度127mmif Value < 127 then Value := 127; file://自定义纸张最大高度432mm if Value > 432 then Value := 432;  Printer.PrinterIndex := Printer.PrinterIndex;  Printer.GetPrinter(Device, Driver, Port, hDMode);  if hDMode <> 0 then   begin    pDMode := GlobalLock(hDMode);    if pDMode <> nil then    begin     pDMode^.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);var Device : array[0..255] of char; Driver : array[0..255] of char; Port : array[0..255] of char; hDMode : THandle; PDMode : PDEVMODE;beginfile://自定义纸张最小宽度76mmif 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 then  begin   pDMode := GlobalLock(hDMode);   if pDMode <> nil then   begin    pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE or              DM_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 PrintText(X, Y: Extended; Txt: string; ConfigFileName: string; FontSize: Integer=12);var OrX, OrY: Extended; Px, Py: Integer; AP: TPoint; Fn: TStrings; FileName: string; OffSetX, OffSetY: Integer;beginfile://打开配置文件,读出横向和纵向偏移量try Fn := TStringList.Create; FileName := ExtractFilePath(Application.ExeName) + ConfigFileName; if FileExists(FileName) then begin  Fn.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;finally Fn.Free;end;X := X + OffSetX;Y := Y + OffSetY;Px := Round(Round(X * HPointsPerInch * 10000/25.4) / 10000);Py := Round(Round(Y * VPointsPerInch * 10000/25.4) / 10000);Py := Py - GetOffSetY; file://因为是绝对坐标, 因此, 不用换算成相对于Y轴坐标Px := Px + 2 * AvgCharWidth;Printer.Canvas.Font.Name := '宋体';Printer.Canvas.Font.Size := FontSize;file://Printer.Canvas.Font.Color := clGreen;Printer.Canvas.TextOut(Px, Py, Txt);end;  2. 使用举例  在主窗体中加入对mprint单元的引用,在一命令钮的OnClick事件中书写如下代码(用于在邮政汇款单上的相应方框内打印邮政编码843300):Printer.BeginDoc;PrintText(16, 14, '8', 'config.txt');PrintText(26, 14, '4', 'config.txt');PrintText(36, 14, '3', 'config.txt');PrintText(46, 14, '3', 'config.txt');PrintText(56, 14, '0', 'config.txt');PrintText(66, 14, '0', 'config.txt');Printer.EndDoc;  观察结果,用尺子测量偏移量,在config.txt文件中修改X,Y的值即可。  其它,设置打印机和纸张类型从略。
      

  6.   

    感谢大家的回复
    特别是Means_pan(酷鱼-真的是"难得胡涂") 
    还有没有其他的兄弟有什么资料或是建议
      

  7.   

    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:integer;
      i:integer;
      IntHeJi:string;
      vDocID: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;
      end;
      
      if SysDM.GetSysParam(pkSys_BillVersion)=1 then 
      begin
        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:=1270;//设置打印页长
               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(95,220,QryPrint1.FieldByName('XingMing').AsString);
        Printer.Canvas.TextOut(255,745,'No. '+QryPrint1.FieldByName('DanJuID').AsString);
        //Printer.Canvas.TextOut(255,190,QryPrint1.FieldByName('LeiBieMC').AsString);    Printer.Canvas.TextOut(35,525,SysDM.GetSysParam(pkOut_InvoiceEmptyFormat1));
        Printer.Canvas.TextOut(35,625,SysDM.GetSysParam(pkOut_InvoiceEmptyFormat2));    //打印单据日期
        Printer.Canvas.TextOut(250,220,vDate);    vHeJi:=FormatFloat('0.00',QryPrint1.FieldByName('ShiShouJE').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(135,680,'负'+vPrintHeJi)
        else Printer.Canvas.TextOut(135,680,vPrintHeJi);
        //打印备注信息
        Printer.Canvas.TextOut(600,680,SysDM.GetSysParam(pkOut_InvoiceMemoInfo));
        //打印收款人
        Printer.Canvas.TextOut(110,730,QryPrint1.FieldByName('ShouKuanYBM').AsString);    Printer.Canvas.font.size:=9;
    Printer.Canvas.TextOut(245,720,'医生编码: '+vDocID);
        Printer.Canvas.font.size:=11;
        Printer.Canvas.TextOut(700,730,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(vX,vY,'')
            else
              Printer.Canvas.TextOut(vX,vY,FormatFloat('0.00',FieldByName('JinE').AsFloat));
            QryPrint4.Next;
          end;
        end;
        Printer.Canvas.font.size:=9;
        Printer.Canvas.TextOut(580,170,'收费项目                       数量   金额');
        Printer.Canvas.TextOut(580,190,'--------------------------------------------');
        Y := 210;
        while not QryPrint3.Eof do
        begin
          Printer.Canvas.TextOut(580,Y,QryPrint3.FieldByName('ZiDingMa').AsString+' '+QryPrint3.FieldByName('YaoMing').AsString);
          Printer.Canvas.TextOut(950,Y,FormatFloat('0',QryPrint3.FieldByName('ShuLiang').AsFloat)+Copy(QryPrint3.FieldByName('DanWei').AsString,0,2));
          Printer.Canvas.TextOut(1035,Y,FormatFloat('0.00',QryPrint3.FieldByName('JinE').AsFloat));
          QryPrint3.Next ;
          Y := Y + 25;
        end;
        Printer.EndDoc;
      end;
    end;
      

  8.   

    我用fastreport做连续纸发票打印也没问题,并且调整方便,可视化设计,并且可以把报表编辑器发布给用户。
    http://218.56.11.178:8020/web/index.aspx-》下载基地-》控件-数据库/报表-》fastreport报表工具          -》程序员读物-》fastreport报表使用手册有兴趣研究研究!