各位大佬:
小弟是新手,做一个简单的类似超市收银条打印,打印机是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;
请各位高手指教,万分感谢
小弟是新手,做一个简单的类似超市收银条打印,打印机是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 查看下打印代码,换行是怎么处理的
2 WriteLn(F,''+ MC1+'/ '+su+' /'+dj1+' /'+je1+'/ '+bz1);
上面语句中的变量有没有多余的回车换行
SU:=floattostr(adotable1.fieldbyname('sl').asfloat);
dj1:=floattostr(adotable1.fieldbyname('dj').AsFloat);
je1:=floattostr(adotable1.fieldbyname('je').asfloat);
bz1:=adotable1.fieldbyname('bz').AsString;这些是否都trim掉前后的空格,或设定成定成长的。应该设定固定长度为最好。
继续顶一下
顶顶帖子高手们
也请多多赐教
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
先看看是否是你的程序自己生成了多余的空格. 方法如下: 1. 把 AssignFile(F,'LPT1'); 修改为 AssignFile(F,'c:\testFile.txt');
这样,用一些有二进制显示能力的文本工具(如uedit32)打开 c:\testfile.txt ,你看看你程序所生成的空格是否多余, 0d ,0a 是否有多余的生成2. 如果确认你的空格是正常的,那么,就是你对 EPSON220D 的控制指令运用有问题了,可能某些地方你设置了双倍行距或者大字符占用的位置数超过了你自己的估算(例如你所有的 4 倍字符大小 )