各位前辈:
    我要实现打印票据的功能,票据的大小是:250mmX70mm,我在打印机设置里已经把纸张大小设为了250mmX70mm,可是打印机在走纸的时候只走68mm,这样我就实现不了精确打印了。但是很奇怪的是,我把大小设置成250mmX72mm,打印机竟然走纸正确,恰好是72mm,我就奇怪了,可是我不可能改票据大小啊。
    
    希望熟悉delphi打印的高人帮我看下这个问题,给点建议怎么解决啊?或者说这是打印机的问题?
    
    我现在的解决办法是每打一张,打印的位置就做相应的改变,但是问题又来了,连续打印多张票据的话,打印位置会超过票据设定好的大小,导致打印失败。    谢谢各位!

解决方案 »

  1.   

    你把報表改成這個大小試試呀.250mmX72mm
      

  2.   

    我不是用报表打印的,是直接用TPrinter打印的。
      

  3.   

    俺前两天也做过一个工资单打印的东东,171*70 连打后发现每二十张左右就会差出半张的,(不过俺不是用Tprinter)经过几天折腾,把脑袋想爆了,油墨耗干了,纸也打干净了,报表工具也换了三四种之后,俺发现好象是纸的规格打印机不支持~~~ -_-" 因为我用其它型号的纸(217*72)连打几百张都没问题 不知这位老兄是不是和我遇到一样的问题了
      

  4.   

    由于客户已经把薪资袋做好了,我没办法只能适应客户需求,所以后来我的解决办法是
    在程序里 
    if PageNum mod i =0 then
        pageLength:=72
    else
        pageLength:=68 ;
    就这样一页长一点,一页短一点,给客户测试,结果几百页就打出去没问题了
      

  5.   

    windows下进行连续纸打印不是太好。不如dos程序,你可以调用dos的程序打。
    有位高人对TPrinter做封装 TRawprinter,可以在windows下连续进纸,贴出来给你参考。unit Rawprinter;interfaceuses printers,windows;type
      TRawprinter =class(TPrinter)
          public
            dc2 : HDC;
            procedure startraw;
            procedure endraw;
            procedure write(const s : string);
            procedure writeln;
          end;implementationuses sysutils,forms;function AbortProc(Prn: HDC; Error: Integer): Bool; stdcall;
    begin
      Application.ProcessMessages;
      Result := not Printer.Aborted;
    end;
    type
      TPrinterDevice = class
        Driver, Device, Port: String;
        constructor Create(ADriver, ADevice, APort: PChar);
        function IsEqual(ADriver, ADevice, APort: PChar): Boolean;
      end;
    constructor TPrinterDevice.Create(ADriver, ADevice, APort: PChar);
    begin
      inherited Create;
      Driver := ADriver;
      Device := ADevice;
      Port := APort;
    end;
    function TPrinterDevice.IsEqual(ADriver, ADevice, APort: PChar): Boolean;
    begin
      Result := (Device = ADevice) and (Port = APort);
    end;
    procedure TRawprinter.startraw;
    var
      CTitle: array[0..31] of Char;
      CMode : Array[0..4] of char;
      DocInfo: TDocInfo;
      r : integer;
    begin
      StrPLCopy(CTitle, Title, SizeOf(CTitle) - 1);
      StrPCopy(CMode, 'RAW');
      FillChar(DocInfo, SizeOf(DocInfo), 0);
      with DocInfo do
      begin
        cbSize := SizeOf(DocInfo);
        lpszDocName := CTitle;
        lpszOutput := nil;
        lpszDatatype :=CMode;
      end;
      with TPrinterDevice(Printers.Objects[PrinterIndex]) do
      begin
        DC2 := CreateDC(PChar(Driver), PChar(Device), PChar(Port), nil);
      end;
      SetAbortProc(dc2, AbortProc);
      r:=StartDoc(dc2, DocInfo);
    end;
    procedure TRawprinter.endraw;
    var r : integer;
    begin
      r:=windows.enddoc(dc2);
    end;
    type passrec = packed record
         l : word;
         s : Array[0..255] of char;
       end;
    var pass : Passrec;
    procedure TRawprinter.write(const s : string);
    begin
      pass.l:=length(s);
      strpcopy(pass.s,s);
      escape(dc2,PASSTHROUGH,0,@pass,nil);
    end;
    procedure TRawprinter.writeln;
    begin
      pass.l:=2;
      strpcopy(pass.s,#13#10);
      escape(dc2,PASSTHROUGH,0,@pass,nil);
    end;end.
      

  6.   

    暂时不结帖子了,因为到了周末,可能要下星期再来结贴了,我遇到的问题应该和hwkknd(白开水)老兄是一样的,我用你的方法先去试试。
      

  7.   

    欢迎加入Borland DELPHI女程序员,参与群里技术讨论!欢迎女孩子,也欢迎男孩子参与技术讨论!群号15154361
      

  8.   

    俺那时候做POS系统是用的EPSON的TM210,当时直接用的ESC/POS指令控制的……
    分毫不差!!!不过打印机要有硬字库!!