请教:在delphi中如何发送打印机控制码?在我的打印机操作面板上有一个功能按钮——换行,执行后打印机向前走纸0.5cm,我想在程序中调用这个换行功能,请高手指点如何实现?windows提供的escape可以给打印机发送控制码,其定义如下:
int Escape(
    HDC hdc, // 打印机的handle  
    int nEscape, // escape 函数 
    int cbInput, // 输入结构的大小 
    LPCSTR lpvInData, // 输入结构的指针 
    LPVOID lpvOutData  // 输出结构的指针 
   );
在这个定义中,第二个参数nEscape,我不清楚要传什么呢?说明文档说提到,这个参数必须是一个预先定义好的,windows下提供了如下的几个定义:ABORTDO;ENDDOC;GETPHYSPAGESIZE;GETPRINTINGOFFSET;GETSCALINGFACTOR;NEWFRAME;NEXTBAND;PASSTHROUGH;SETABORTPROC;STARTDOC;其中好像没有我需要的,用于换行的。在win32api的说明文档中也提到,对于常用的print escape都已经定义对应的方法,如:AbortDoc,EndDoc等,没有对应的用于换行的方法。同时也了解到,如果需要发送一些私有的print escape 需要用到extEscape函数,该函数的定义如下:int ExtEscape(
    HDC hdc, //设备Handle
    int nEscape, // escape function 
    int cbInput, // number of bytes in input structure 
    LPCSTR lpszInData, // pointer to input structure 
    int cbOutput, // number of bytes in output structure 
    LPSTR lpszOutData  // pointer to output structure 
);同样的,在这个函数的定义中,我不知道需要都要传入那些参数呢??
我的环境是delphi7.0/winXP/EPSON LQ-1600KIII请高手们关注。

解决方案 »

  1.   

    这些票据打印机手册上都会有的,
    这是票据打印一段代码(Epson LQ300K),仅供参考:
    procedure PrintTicket(AStation,Achannel,Auserid,ATicketNo,
            AMoney,APntdate,APnttime:string);stdcall;
    var
      F:TextFile;
      ...
    begin
      ....
      Assignfile(f,'LPT1');   
      rewrite(f);
      {初始化打印机}
      Write(f,chr(27)+'@');  //Chr(27)+'@' 即ESC @ 指令
      {设置汉字显示方式}
      write(f,chr(28)+chr(ord('&')));  //Chr(28) 即 FS
      {设定打印相对水平位置}
      Write(f,chr(27)+chr(ord('\'))+chr($CF)+chr($00));
      //设置高速打印
      //write(f,chr(28)+chr(ord('x'))+chr($01));  Writeln(f,PrintChannel+space(16)+Auserid+space(12)+carType);
      Writeln(f);
      write(f,chr(27)+chr(ord('\'))+chr($CF)+chr($00));
      Write(f, AMoney);
      Writeln(f,Space(26)+PrntTicketno);
      Writeln(f);
      write(f,chr(27)+chr(ord('\'))+chr($CF)+chr($00));
      //Writeln(f);
      Writeln(f,Apntdate+Space(12)+ApntTime);
      //顺时针走纸控制
      Writeln(f,chr(27)+chr(ord('J'))+chr($FF));
      Writeln(f,chr(27)+chr(ord('J'))+chr($20));  flush(f);
      Closefile(f);end;不同的打印机控制码会有所不同,具体参考打印机手册。》怎么让打印机在打印前后退2行,设定纸张的大小
    将打印机纸张类型设为自定义,自定义纸张大小,
    这类代码很多,搜索一下,以上也有给出了一些
    至于,打印前后退2行,先将纸张在打印机装好,控制好
    其装纸位置(可微调打印机),打印后重要的是走纸的控制,
    最好是用控制码控制,实在没办法的话,你也可以用
    writeln(f)
    writeln(f)
    这样的折行控制。>>//顺时针走纸控制
    >>Writeln(f,chr(27)+chr(ord('J'))+chr($FF));
    >>Writeln(f,chr(27)+chr(ord('J'))+chr($20));这个是我根据打印机控制码指令
    执行n/180英寸顺方向走纸 Esc J n    (1<=n<=255)
    以及打印票据纸张的高度,来调整打印连续纸时的走纸长度。
    另外,这里还有一些LQ300K的一些打印位置控制码指令:
    设定高速打印 FS x n (n=0,1)
    设定绝对水平打印位置 Esc ¥ nL nH  (0<=nH<=127
                                       0<=nL<=255)
    设定相对水平打印位置 Esc \ nL nH    (同上)供参考。具体你可以查看你的打印机手册。
      

  2.   

    谢谢,这位大侠了,打印机手册我已经 有了,也已查阅。
    方法就如你所说的,我都试了,和你代码唯一的区别是,你使用 Assignfile(f,'LPT1'); 打开打印机端口,而我使用
     assignprn(f) 来打开打印机端口的,而实际上我的计算机因为是笔记本,所以打印机是通过usb口和打印机联系起来的,所以我想直接的操作 lpt1估计不行吧??
      

  3.   

    另外,我还想问的是:>>Writeln(f,chr(27)+chr(ord('J'))+chr($FF));
    >>Writeln(f,chr(27)+chr(ord('J'))+chr($20));这两句代码中 J,和 $FF或者$20分别代表了什么阿??
    从我的打印机手册中查到 ,换行是两个指令即:ESC + LF,对应的十进制编码也就是 27,10。
    为什么你这里 中间会多一个 值呢??难道是打印机型号不同所致??
    我的是 EPSON LQ-1600KIII