求关于pos的小票格式问题 (关于write函数)(100分)

  • 主题发起人 主题发起人 苦海无边
  • 开始时间 开始时间

苦海无边

Unregistered / Unconfirmed
GUEST, unregistred user!
如何能用write函数实现如下效果
The shoping welcome you
-----------------------
list
-----------------------
袜子
编号:0014 定价:20
折扣:90 实洋:18
电热宝
编号:00147 定价:50
折扣:100 实洋:50
-----------------------
........
谢谢回顾
问题主要是 如何实现商品列表的打印格式 编号 定价 等内容的位置都是固定的.
换句话说就是不管数字怎么变 编号 定价 ...这几个汉字的位置在本行都是固定不便,不会
错位!

 
用print.canvas 自己画啦。
procedure TfrmSale.btnPrnClick(Sender: TObject);
var
y,r : integer;
fpe : Boolean;
//发票额是否已记入明细中
begin

fpe := False;
if not InitPrinter then
begin
Application.MessageBox('未安装打印机或打印机驱动程序丢失,请与系统管理员联系!', '出错', mb_IconError + mb_OK);
Exit;
end;
SetPaperSize(1200,1400);
//打印文本
try
Printer.begin
Doc;
with Printer.Canvas do
begin
DM.ADSlsd.First;
Font.Name := '宋体';
Font.Size := 16;
TextOut(TX(100),TY(1),' . ');
TextOut(TX(350),TY(20),lsdname);
Font.Size := 10;
TextOut(TX(140),TY(130),'票号:' + edtxpbh.Text );
TextOut(TX(450),TY(130),formatdatetime('yyyy/mm/dd hh:mm',Now));
TextOut(TX(780),TY(130),'操作员:' + czy);
TextOut(TX(100),TY(170),'━━━━━━━━━━━━━━━━━━━━━━━━━━');
TextOut(TX(120),TY(220),'商品编号 商品名称 尺码 颜色 数量 金额');
TextOut(TX(100),TY(260),'--------------------------------------------------');
r := 1;
y := 60;
while sgsp.Cells[0,r] <> ''do
begin
TextOut(TX(100),TY(250 + y),sgsp.Cells[0,r]);
TextOut(TX(340),TY(250 + y),sgsp.Cells[1,r]);
TextOut(TX(620),TY(250 + y),sgsp.Cells[3,r]);
TextOut(TX(710),TY(250 + y),sgsp.Cells[2,r]);
TextOut(TX(830),TY(250 + y),sgsp.Cells[10,r]);
TextOut(TX(910),TY(250 + y),sgsp.Cells[12,r]);
inc(r);
inc(y,60);
end;
// TextOut(TX(140),TY(220),'');
// TextOut(TX(140),TY(220),'');
// TextOut(TX(140),TY(220),'');
// TextOut(TX(140),TY(220),'');
// TextOut(TX(140),TY(220),'');
TextOut(TX(100),TY(760),'━━━━━━━━━━━━━━━━━━━━━━━━━━');
TextOut(TX(100),TY(800),'应收:' + FormatCurr('0.00',ysk));
TextOut(TX(350),TY(800),'实收:' + FormatCurr('0.00',edtss.Value));
TextOut(TX(580),TY(800),'现金:' + FormatCurr('0.00',edtxj.Value));
TextOut(TX(820),TY(800),'回找:' + FormatCurr('0.00',edtZl.Value));
TextOut(TX(120),TY(900),DM.ADSlsd.Fieldbyname('Fend1').AsString);
TextOut(TX(120),TY(950),DM.ADSlsd.Fieldbyname('Fend2').AsString);
TextOut(TX(100),TY(1000),'━━━━━━━━━━━━━━━━━━━━━━━━━━');
TextOut(TX(120),TY(1030),'让您满意是我们最大的心愿');
end;
Printer.EndDoc;
DM.ADOConnection1.begin
Trans ;
if edtbh.Text <> '' then
begin
with DM.ADShydo
begin
if Locate('Fbh',edtbh.Text,[]) then
begin
Edit;
FieldValues['Fjf'] := FieldValues['Fjf'] + fz;
FieldValues['Fxfje'] := FieldValues['Fxfje'] + edtss.Value;
FieldValues['Flastxfd'] := DM.ADSlsd.Fieldbyname('Fname').AsString;
FieldValues['Flastxfr'] := date;
FieldValues['Flastxfe'] := edtss.Value;
Post;
end;
end;
end;

r := 1;
try
while sgsp.Cells[0,r] <> ''do
begin
with DM.ADSsaledo
begin
Append;
FieldByName('Frq').AsDateTime := Date;
FieldByName('Fsj').AsDateTime := Time;
FieldByName('Ffph').AsString := edtxpbh.Text;
FieldByName('Fgroup').AsString := cbgz.Text;
FieldByName('Flsj').AsCurrency := strtocurr(sgsp.Cells[13,r]);
if stxm.Caption <> '' then
FieldByName('Fhybh').AsString := edtbh.Text;
FieldByName('Fspbh').AsString := sgsp.Cells[0,r];
FieldByName('Fsl').AsInteger := strtoint(sgsp.Cells[10,r]);
FieldByName('Fdj').AsCurrency := strtocurr(sgsp.Cells[8,r]);
FieldByName('Fkh').AsString := sgsp.Cells[5,r];
if sgsp.Cells[11,r] <> '' then
FieldByName('Fzk').AsInteger := strtoint(sgsp.Cells[11,r]);
FieldByName('Fje').AsCurrency := strtocurr(sgsp.Cells[12,r]);
if Not fpe then
begin
FieldByName('Ffpe').AsCurrency := edtss.Value;
fpe := True;
end
else
begin
FieldByName('Ffpe').AsCurrency := 0;
end;
FieldByName('Fczy').AsString := '';
Post;
end;
inc(r);
end;
DM.ADOConnection1.CommitTrans;
clrall;
except
DM.ADOConnection1.RollbackTrans;
Application.MessageBox('入库错误,请清除后重新打印本销售单。','警告',MB_OK);
raise;
end;
except
Application.MessageBox('打印出错,请清除后重新打印本销售单。','警告',MB_OK);
end;
end;
 
这个其实用报表控件来实现的话不是很难,不过你的意思是不是
纯手工打造?
画到那个canvas上,然后打印这个?如果是的话,我可能要想一下
因为太久没有干这种“体力活”了^_^
 
我用的打印机是pos58
接口提供就是用write 写lpt端口
而且超级着急 马上就要用
白哥的办法固然好 但是 我在校对格式上需要大量的时间.
我现在这个所有的技术问题都解决了, 可就是不会用write控制格式
所以我还想知道 能不能用write 在指定的位置写字符
用手画的 ..... 时间.....来不及.....了.......
 
write 也不好控制。
 
Var F:TextFile;
PDStr:string;
begin
PDStr:='就是利用这个方式打印'+chr(10);
AssignFile(F, 'LPT1');
Rewrite(F);
Write(F, PDStr);<-------------(格式不知道如何控制)
CloseFile(F);
end;
 
write能不能实现 在指定的位置写字符??
找不到相应的帮助阿.
 
所有的数字(字符串)都取固定长度,不够长的用空格补
 
用空格填充。
 
door2000 说的办法到是一个思路.. 谢谢
好了 就这么办了 谢谢各位
特别是白兄 谢谢你的办法,我以后的票子都会这么试的
 
多人接受答案了。
 
能不能自己写一个函数,
再在函数里调用write用空格填充,这样就可以以指定位置作为参数了,
不过我没试过,
 
do u use delphi? please use 'format' function provided in Delphi.
sorry i'm not using delphi now, nordo
i have it installed, so please search in it's help for usage.
 
后退
顶部