各位大佬:
小弟是新手,做一个简单的类似超市收银条打印,打印机是EPSON220的,系统是XP,发现每一行的商品明细栏过宽(相当于一倍),而最后的总结栏却是正常,如
 单号
打印时间
商品名称  金额 数量 单价
----------------------------  以上正常
水果      10    1   10
--------------------------
饮料      1      1   1
---------------------------- 以上每栏过宽,几乎可以打印二个品种
     应收金额
     实收金额
     找零
------------------------------以上总计栏正常
程序如下:
procedure TForm5.xpdy;
 var
  F:TextFile;
  i1:integer;
  s1,mc1,bz1:string;
  dj1,SU,je1:STRING;
begin
try
    AssignFile(F,'LPT1');
    Rewrite(F);    //打印标题
    Writeln(F,chr($1b) + chr($40));          //[初始化打印机
    Writeln(F,Chr($1b) + Chr($72) + '1');    //设置红色打印
    Writeln(F,chr($1b) + chr($61) + '1');    //居中打印
    Writeln(F,chr($1c) + chr($21) + '4');    //倍宽打印
    adotable1.Open;
    adotable1.First;
     s1:=trim(edit1.text);
    Writeln(F,chr($1b) + chr($61) + '0');  //取消居中打印
    Writeln(F, '单号:' + s1);    //显示帐单号
         Writeln(F,chr($1c) + chr($21) + '0');
    Writeln(F,'打印时间:' + datetimetostr(Now));
    Writeln(F,'----------------------------------------');
    Writeln(F,'  商品名称           /数量/单价/金额/备注');
    writeln(F,   CHAR(27)+CHAR(48));    for  i1:=0 to adotable1.RecordCount-1 do
    begin
        mc1:=adotable1.fieldbyname('spmc').AsString;
        SU:=floattostr(adotable1.fieldbyname('sl').asfloat);
        dj1:=floattostr(adotable1.fieldbyname('dj').AsFloat);
        je1:=floattostr(adotable1.fieldbyname('je').asfloat);
         bz1:=adotable1.fieldbyname('bz').AsString;
   // Writeln(F,'----------------------------------------');    WriteLn(F,''+ MC1+'/ '+su+' /'+dj1+' /'+je1+'/ '+bz1);
        adotable1.Next;
    
    end;
    
    //打印尾标
    Writeln(F,'----------------------------------------');
    writeln(F,'                      应收金额:' + trim(edit2.text) + '元');
    writeln(F,'                      实收金额:' + trim(edit3.text) +'元' );
    writeln(F,'                      找    零:' + trim(edit4.text)+ '元');
        //打印完毕,切纸
    Writeln(F,chr($1d)+ 'V' + chr(66) + chr(0));  //切纸
  finally
    closefile(F)
end;
请各位高手指教,万分感谢

解决方案 »

  1.   


    1 查看下打印代码,换行是怎么处理的
    2 WriteLn(F,''+ MC1+'/ '+su+' /'+dj1+' /'+je1+'/ '+bz1);
    上面语句中的变量有没有多余的回车换行
      

  2.   

      mc1:=adotable1.fieldbyname('spmc').AsString;
      SU:=floattostr(adotable1.fieldbyname('sl').asfloat);
      dj1:=floattostr(adotable1.fieldbyname('dj').AsFloat);
      je1:=floattostr(adotable1.fieldbyname('je').asfloat);
      bz1:=adotable1.fieldbyname('bz').AsString;这些是否都trim掉前后的空格,或设定成定成长的。应该设定固定长度为最好。
      

  3.   

     换行应如何处理,因为是第一次不知如何写,原程序中的 writeln(F, CHAR(27)+CHAR(48))这语句已去除,但还是如此,观察打印出来的纸张,发现是打印完文字后的下面空白多,如除去空白即可,是否是电脑在做赋值语句同时,打印机在走纸所造成,如果指令 做赋值语句打印机不动,即可,不知此思路对否(自已想来似乎不太对)。不知如何是好(打印机是针式的)
      

  4.   

    学习学习先
    继续顶一下
    顶顶帖子高手们
    也请多多赐教
    http://topic.csdn.net/u/20110709/12/3ec63017-cef8-41e0-a524-c9b9dfe56d5c.html
    http://topic.csdn.net/u/20110611/12/3258c959-4f28-46b7-b5d6-46135d73036b.html
    http://topic.csdn.net/u/20110722/14/89f7440b-c4d7-4c9a-a4bb-a503f5135db2.html
    http://topic.csdn.net/u/20110729/10/a7bfaf06-0cf9-4580-8e91-d4e0b92066c6.htmlhttp://topic.csdn.net/u/20110811/16/e56e7cc1-d8c9-40af-92e3-c24ca103d17d.html
    http://topic.csdn.net/u/20110830/13/dfae4ca5-d2b9-4889-8a3c-6f7fb61936c9.html
    http://topic.csdn.net/u/20110831/17/427b6ab0-66c6-4f33-af26-ebd27b0dc541.html
    http://topic.csdn.net/u/20110901/09/83c2c668-cbe6-4db9-966d-bf2f47456811.html
    http://topic.csdn.net/u/20110905/12/a1161adb-8e5d-491a-b302-c9722edf2dab.html
    http://topic.csdn.net/u/20110906/10/86d49517-b7a6-4fae-982b-478d2d6e2a23.html
      

  5.   

    各位大佬,给一点实质性的吧,小弟的打印机是EPSON220D,还有打印开始总是要走一段纸,能否不走纸打印(省一点),我想EPSON的POS机指令应该相同的吧?请指教
      

  6.   

    各位大佬,谁有类似的例子,请发一个给我([email protected]),好撒分啊
      

  7.   

    解决思路:
    先看看是否是你的程序自己生成了多余的空格. 方法如下:  1. 把 AssignFile(F,'LPT1');  修改为 AssignFile(F,'c:\testFile.txt'); 
    这样,用一些有二进制显示能力的文本工具(如uedit32)打开 c:\testfile.txt ,你看看你程序所生成的空格是否多余, 0d ,0a 是否有多余的生成2. 如果确认你的空格是正常的,那么,就是你对 EPSON220D 的控制指令运用有问题了,可能某些地方你设置了双倍行距或者大字符占用的位置数超过了你自己的估算(例如你所有的 4 倍字符大小 )