我用的是FastReport2.5
由于存在打印走纸的问题(连续打印多张后,打印内容会上、下偏移),我想在每张纸打印之前在程序中发送一个打印机复位的命令,请问应该怎么写,写在哪??
谢谢!100分,问题一解决马上结账。

解决方案 »

  1.   

    看得向并口发 复位命令,你查一下你所用打印机的标准协议 
    大概是 :ESC @
      

  2.   

    找一个 类似 《pos2000公达.pdf》的文档看看
      

  3.   

    具体写 稍微有点麻烦,我给你一段以前同事留下的一段代码,你参考参看,稍微有点乱。
     unit PortUtls;interface
    uses windows,SysUtils;
    const
       addr_list:array[1..8] of word = ($3f8,$2f8,$3e8,$2e8,$dc00,$dc08,$dc10,$9018);
       DBUF =   $0  ;        // DATA BUFFER REGISTER
       LSB  =   $0  ;
       MSB  =   $1  ;
       IER  =   $1  ;        // intr enable register
       IIR  =   $2  ;        //  intr ident. register
       LCR  =   $3  ;        //   line control register
       MCR  =   $4  ;        //   modem control register
       LSR  =   $5  ;        //   line status register
       MSR  =   $6  ;        //  modem status register
    var
            lines:Array[0..400] of char;
            line1:Array[1..1000]of Char;
            line2:Array[1..1000]of Char;
            myfont:Array[0..31] of Char;
      FHandle:THandle;
       PrnPort:integer;   FPrnHandle1,FPrnHandle2:THandle;
       iPrnPort1,iPrnPort2:integer;   function  SendStr(iPort:integer;AP:Pchar;Count:integer):Boolean;export;stdcall;far;
       function  OpenPort(bPt:byte):boolean;
       procedure ClosePort;
    {=========================函数原型声明==================================}
    // 读端口函数,一次读取一个字节。
    function  PortReadByte(wAddr: Word): Byte;// 高速读端口函数,一次读取一个字(Two Byte)。
    // 对某些不能使用WORD访问的计算机或卡可能会引起问题,
    // 但一般情况下能正常使用。
    function  PortReadWord(wAddr: Word): Word;// 低速读端口函数,一次读取一个字(Two Byte)。
    // 可以在任何情况下使用, 必要时调整DELAY的数值。
    function  PortReadWordLS(wAddr: Word): Word;// 写端口函数,一次写一个字节。
    procedure  PortWriteByte(wAddr: Word; bValue: Byte);// 高速写端口函数,一次写一个字。
    // 对某些不能使用WORD访问的计算机或卡可能会引起问题,
    // 但一般情况下能正常使用。
    procedure  PortWriteWord(wAddr: Word; wValue: Word);// 低速写端口函数,一次写一个字。
    // 可以在任何情况下使用, 必要时调整DELAY的数值。
    procedure  PortWriteWordLS(wAddr: Word; wValue: Word); Function InitSerialPort(wAddr: Word; wValue: Word):Word; assembler; register;
     Function ReceiveByte(n:integer):Byte;
     Function SendByteWithWait(n:integer;c:byte):Boolean;
     Function SendByteWithoutWait(n:integer;c:byte):Boolean;
     procedure SendStringWithoutWait(n:integer;s:string);
     procedure SendStringWithWait(n:integer;s:string);
     Function ReceiveString(n:integer;Len:integer):string;
     function InterPalComm(wValue:word;wPt:word):word;assembler;
     function PalComm(bType,bValue:byte;wPt:word):byte;
     procedure OutVal(bValue:byte;wAddr:word);assembler;
     function InitPalPrn(iPt:integer):integer;
     function SendStrToPalPrn(iPt:integer;str:string;iStrLen:integer):integer;
     function PalPrnStr(iPt:integer;str:string):integer;implementation
    //=======================================================================
    // 名称:    PortReadByte
    // 说明: 读端口函数,一次读取一个字节。
    // 参数: wAddr:Word
    // 端口地址
    // 返回: Byte
    // 从给定端口读回的值。//=======================================================================
    function PortReadByte(wAddr: Word): Byte; assembler; register;
    asm
    MOV   DX, AX
    IN     AL, DX
    end;//=======================================================================
    // 名称:    PortReadWord
    // 说明: 高速读端口函数,一次读取一个字(Two Byte)。
    // 对某些不能使用WORD访问的计算机或卡可能会引起问题,
    // 但一般情况下能正常使用。
    // 参数: wAddr:Word
    // 端口地址
    // 返回:   Word
    // 从给定端口读回的值。//=======================================================================
    function PortReadWord(wAddr: Word): Word; assembler; register;
    asm
    MOV   DX, AX
        IN     AX, DX
    end;//=======================================================================
    // 名称:    PortReadWordLS
    // 说明: 低速读端口函数,一次读取一个字(Two Byte)。
    //  可以在任何情况下使用, 必要时调整DELAY的数值。
    // 参数: wAddr:Word
    // 端口地址
    // 返回:   Word
    // 从给定端口读回的值。//=======================================================================
    function PortReadWordLS(wAddr: Word): Word; assembler; register;
    const
    Delay = 150;    // depending of CPU speed and cards speed
    asm
        MOV DX, AX
        IN AL, DX // read LSB port
        MOV ECX,Delay
    @1:
        LOOP @1 // delay between two reads
        XCHG AH, AL
        INC DX // port+1
        IN AL, DX // read MSB port
    XCHG AH, AL // restore bytes order
    end;//=======================================================================
    // 名称:    PortWriteByte
    // 说明: 写端口函数,一次写一个字节。
    // 参数: wAddr:Word
    // 端口地址
    // bValue:Byte
    //            写到端口的数值
    // 返回: 无//=======================================================================
    procedure PortWriteByte(wAddr: Word; bValue: Byte); assembler; register;
    asm
    XCHG AX, DX
        OUT     DX, AL
    end;//=======================================================================
    // 名称:    PortWriteWord
    // 说明: 高速写端口函数,一次写一个字。
    // 对某些不能使用WORD访问的计算机或卡可能会引起问题,
    // 但一般情况下能正常使用。
    // 参数: wAddr:Word
    // 端口地址
    // wValue:Word
    //            写到端口的数值
    // 返回: 无//=======================================================================
    procedure PortWriteWord(wAddr: Word; wValue: Word); assembler; register;
    asm
    XCHG AX, DX
        OUT DX, AX
    end;//=======================================================================
    // 名称:    PortWriteWordLS
    // 说明: 低速写端口函数,一次写一个字。
    //  可以在任何情况下使用, 必要时调整DELAY的数值。
    // 参数: wAddr:Word
    // 端口地址
    // wValue:Word
    //            写到端口的数值
    // 返回: 无//=======================================================================
    procedure PortWriteWordLS(wAddr: Word; wValue: Word); assembler; register;
    const
    Delay = 150; // depending of CPU speed and cards speed
    asm
    XCHG    AX,DX
        OUT     DX,AL // port LSB
        MOV     ECX,Delay
    @1:
    LOOP @1 // delay between two writes
        XCHG AH,AL
        INC DX // port+1
        OUT DX,AL // port MSB
    end;
    //=======================================================================
    // 名称:    InitSerialPort
    // 说明: 初始化串口
    // 调用BIOS中断(9600波特率,无奇偶校验,一个起始位,8个数据位)
    // 参数: wAddr:Word
    // 端口地址
    //              wValue:Word
    //        写到端口的数值
    // 返回: 无
    //=======================================================================
    Function InitSerialPort(wAddr: Word; wValue: Word):Word; assembler; register;
    asm
    XCHG AX, DX
        INT    14h
    end;
    {Function InitSerialPort(wAddr: Word; wValue: Word):Word; assembler; register;
    var
        status:Byte;
    begin
         status:=0;
         PortWriteByte(Addr_list[wAddr+1]+LCR,$e3) ;        //读状态寄存器
         status:=PortReadByte(Addr_list[wAddr+1]+LSR) ;        //读状态寄存器
         Result:=status;
    end;}//=======================================================================
    // 名称:    Rec_char
    // 说明: 从串口读入字符
    // 参数: n:Integer
    // 端口地址
    //              c:Byte
    //        输出字符
    // 返回: 无//=======================================================================
    Function ReceiveByte(n:integer):Byte;
    var
        status:Byte;
    begin
         Result:=0;
          status:=0;
       if (n<1) or (n>8) then
               exit;
            while (status and $1)=0 do
                 status:=PortReadByte(addr_list[n]+LSR);
          Result:=PortReadByte(addr_list[n]);
    end;
      

  4.   

    //=======================================================================
    // 名称:    SendByteWithWait
    // 说明:    向串口输出字符(如发送不成功死等待直至数据被取走)
    // 参数: n:Integer
    // 端口地址
    //              c:Byte
    //        输出字符
    // 返回: 无//=======================================================================
    Function SendByteWithWait(n:integer;c:byte):Boolean;
    var
        status:integer;
    begin
         status:=0;
         Result:=False;
         Try
        if (n<1) or (n>8) then
                 exit;
      while((status and $20)=0) do                         //判断是否准备好
                 status:=PortReadByte(Addr_list[n]+LSR) ;        //读状态寄存器    PortWriteByte(addr_list[n]+DBUF,c);                  //发送一个字节{        status:=InitSerialPort(n-1,$0300);
            while(status AND $0200)<>0 do
            begin
                PortWriteByte(addr_list[n]+DBUF,c);          //如果有超越错重发字节
                    status:=InitSerialPort(n-1,$0300);
            end;}
            status:=PortReadByte(Addr_list[n]+LSR);
            while(status AND $02)<>0 do//判断是否有超越错
            begin
                PortWriteByte(addr_list[n]+DBUF,c);          //如果有超越错重发字节
                    status:=PortReadByte(Addr_list[n]+LSR);
            end;
            Result:=True;
         Except
            Result:=False;
         end;
    end;
    //=======================================================================
    // 名称:    SendByteWithoutWait
    // 说明:    向串口输出字符(如发送不成功不等待)
    // 参数: n:Integer
    // 端口地址
    //              c:Byte
    //        输出字符
    // 返回: 无//=======================================================================
    Function SendByteWithoutWait(n:integer;c:byte):Boolean;
    var
        status:integer;
    begin
         status:=0;
         Result:=False;
         Try
        if (n<1) or (n>8) then
                 exit;
      while((status and $20)=0) do                         //判断是否准备好
                 status:=PortReadByte(Addr_list[n]+LSR) ;        //读状态寄存器
        PortWriteByte(addr_list[n]+DBUF,c);                  //发送一个字节
            Result:=True;
         Except
            Result:=False;
         end;
    end;
    //=======================================================================
    // 名称:    SendStringWithtWait
    // 说明: 向串口输出字符串
    // 参数: n:Integer
    // 端口地址
    //              c:Byte
    //        输出字符
    //              len:integer
    //              长度
    // 返回: 无//=======================================================================
    procedure SendStringWithWait(n:integer;s:string);
    var
        i:integer;
    begin
          for i:=1 to Length(s) do
             SendByteWithWait(n,ord(s[i]));
    end;
    //=======================================================================
    // 名称:    SendStringWithouttWait
    // 说明: 向串口输出字符串
    // 参数: n:Integer
    // 端口地址
    //              c:Byte
    //        输出字符
    //              len:integer
    //              长度
    // 返回: 无//=======================================================================
    procedure SendStringWithoutWait(n:integer;s:string);
    var
        i:integer;
    begin
          for i:=1 to Length(s) do
             SendByteWithoutWait(n,ord(s[i]));
    end;
    //=======================================================================
    // 名称:    ReceiveString
    // 说明: 从串口读出字符串
    // 参数: n:Integer
    // 端口地址
    //              c:Byte
    //        读出字符
    //              len:integer
    //              长度
    // 返回: 无//=======================================================================
    Function ReceiveString(n:integer;Len:integer):string;
    var
        i:integer;
    begin
          Result:='';
          for i:=1 to Len do
             Result:=Result+Chr(ReceiveByte(n));
    end;//函数: OpenPort
    //功能: 打开端口(串/并口)
    //参数:bPt:端口号,1:com1,2:com2,3:com3,4:com4,5:lpt1,6:lpt2 ;
    // 返回:true:成功;false:失败
    //外部调用:否
    //如果是串口,采用异步通讯模式;
    function OpenPort(bPt:byte):boolean;
    var
      PortName: pchar;
      PortStr:string;
      tPortDcb:TDCB;
      tms:TCOMMTIMEOUTS;
    begin
    //限制端口号超出范围
      if (bPt<=0) or (bPt>2) then
      begin
        result:=false;
        exit;
      end;
    //如果这个端口已经被打开,不需要重新打开文件。提高速度
    //否则重新生成文件。
      if (PrnPort<>0) and (PrnPort=bPt) then
      begin
        result:=true;
        exit;
      end;
      PrnPort:=bPt;
      PortStr:='LPT';
      PortName:=strAlloc(5);
      try
        case bPt of
        1:StrPCopy( PortName, PortStr+'1');
        2:StrPCopy( PortName, PortStr+'2');
        else
          StrPCopy( PortName, PortStr+'1');
        end;
        if FHandle<>0 then
          ClosePort;    FHandle := CreateFile(
                                    PortName,
                                    GENERIC_READ or GENERIC_WRITE,
                                    0, // Not shared
                                    nil, // No security attributes
                                    OPEN_EXISTING,
                                    FILE_ATTRIBUTE_NORMAL  ,
                                    0 // No template
                              );    if FHandle=invalid_handle_value then
          result:=false
        else begin
          tms.ReadIntervalTimeout:=MaxWord;
          tms.ReadTotalTimeoutMultiplier:=100;//0;
          tms.ReadTotalTimeoutConstant:=100;//1;
          tms.WriteTotalTimeoutMultiplier:=200;//20;
          tms.WriteTotalTimeoutConstant:=200;
          SetCommTimeOuts(FHandle,tms);
          result:=true;
        end;
      finally
        strdispose(PortName);
      end;
    end;//过程:ClosePort
    //功能:关闭端口
    //参数:无
    //外部调用:否
    procedure ClosePort;
    begin
      if FHandle<>0 then
        CloseHandle(FHandle);
      FHandle:= 0;
      PrnPort:=0;
    end;//函数;SendStr
    //功能:往端口发送字符串,包含打开和关闭端口
    //参数:sSendStr:要发送的字符串
    //返回:true:成功;false:失败
    //外部调用:是
    function SendStr(iPort:integer;AP:Pchar;count:integer):Boolean;export;
    var
      nsent:DWord;
      dwDataSize,dError:Dword;
      p:pchar;
      write_os:OVERLAPPED;
    begin
        result:=false;
        if OpenPort(iPort)=false then
        begin
          exit;
        end;
        p:=Ap;
        dwDataSize:=Count;
    //并口通讯处理,简单的同步处理。
        WriteFile( FHandle,p^,dwDataSize,nSent, nil);
        nSent:=abs(nsent);
        if dwDatasize=nSent then
            result:=true;
    end;
    //函数:InterPalComm
    //功能:调用BIOS INT17中断,对并口操作
    //参数:wValue:通信口参数;bPt:端口号,0:LPT1,1:LPT2
    //返回:AX值
    //外部调用:否
    function InterPalComm(wValue:word;wPt:word):word;assembler;
    asm
      INT    17H
    end;//函数:PalComm
    //功能:调用BIOS INT17中断,对并口操作
    //参数:iType:对并口的操作类型,0:写字符;1:初始化,2:取打印机状态;
    //      iValue:要写入的字符;iPt:端口号,0:LPT1,1:LPT2
    //返回:AH值
    //外部调用:否
    //说明: 各参数的设置与C语言中的biosprint()函数完全相同
    function PalComm(bType,bValue:byte;wPt:word):byte;
    var
      wValue,wRes:word;
    begin
      wValue:=bType*$100+bVAlue;
      wRes:=InterPalComm(wValue,wPt);
      result:=wRes div $100;
    end;
    //过程:OutVal
    //功能:将字节输出到硬件端口
    //参数:bValue:要输出的字节;wAddr:硬件地址
    //外部调用:否
    procedure OutVal(bValue:byte;wAddr:word);assembler;
    asm
      OUT DX,AL
    end;
    //函数: InitPalPrn
    //功能: 初始化并口打印机
    //参数: iPt:打印机端口,1:LPT1,2:LPT2
    //返回: 1:成功初始化;0:错误
    function InitPalPrn(iPt:integer):integer;
    begin
      if (iPt<1) or (iPt>2) then
        begin
          result:=0;
          exit;
        end;  PalComm(1,0,iPt-1);
    end;//函数: SendStrToPalPrn
    //功能: 向并口打印机发送字符串
    //参数: iPt:打印机端口,1:LPT1,2:LPT2
    //      str:要发送的字符串
    //      iStrLen:字符串长度
    //返回: 1:成功;-1:错误;
    function SendStrToPalPrn(iPt:integer;str:string;iStrLen:integer):integer;
    var
      i:integer;
      bSta:byte;
    begin
      if (iPt<1) or (iPt>2) then
        begin
          result:=-1;
          exit;
        end;  for i:=1 to iStrLen do
        begin
          bSta:=PalComm(0,ord(str[i]),iPt-1);
          if (bSta and $01)=$01  then
            begin
              result:=0;
              exit;
            end;
        end;  result:=1;
    end;//函数: PalPrnStr
    //功能: 向并口打印机发送字符串并打印
    //参数: iPt:打印机端口,1:LPT1,2:LPT2
    //      str:要发送的字符串
    //返回: 1:成功;-1:错误;
    function PalPrnStr(iPt:integer;str:string):integer;
    begin
      str:=str+#$0a;
      result:=SendStrToPalPrn(iPt,str,length(str));
    end;end.
      

  5.   

    强!好长,看不懂,得慢慢研究。
    刚刚看到一个语句:printer.printerindex:=printer.printerindex;//打印机复位
    这个不知道要怎么用??
    谢谢!
      

  6.   

    我想在打印完一页后,就用
    printer.printerindex:=printer.printerindex;//打印机复位 
    但不知道这语句得放到哪?
    高手请指教,谢谢!