POS小票打印,要如何控制走纸,就是有多少内容,纸张出多少!
除了直接控制打印,还有什么方法嘛,如用报表等!

解决方案 »

  1.   

    我知道答案了!// 向LPT口打印一个文本文件
    procedure TPosFrm.PrintFile(AFileToPrint: string);
    var
     Port, FileToPrint: TextFile;
     ALine: string;
    begin
     AssignFile(FileToPrint, AFileToPrint);
     Reset(FileToprint);
     AssignFile(Port, 'LPT1');
     Rewrite(Port);
     while not Eof(FileToPrint) do
     begin
       Readln(FileToPrint, ALine);
       Writeln(Port, ALine);
     end;
     CloseFile(Port);
     CloseFile(FileToPrint);
    end;
       // 打印小单
       // 输出到文本,稍后再输出到LPT1端口;
       OutFile:=ExtractFilePath(Application.ExeName)+'output.txt';
       AssignFile(F, OutFile);
       Rewrite(F);
       CompanyTitle:=SysParms.CompanyTitle+'购物清单';
       CompanyTitle:=StringOfChar(' ', (32-Length(CompanyTitle)) div 2)+CompanyTitle;
       Writeln(F, CompanyTitle);
       Writeln(F,'--------------------------------');
    //    Writeln(F,'收银机:'+EdPosID.Text+'     单号:'+EdSaleID.Text);
    //    Writeln(F,'收银员:'+EdOpID.Text+ '     日期:'+EdSaleDate.Text);
       Write(F,'收银员:', Format('%-10s', [STOpID.Caption]));
       Writeln(F, '单号:'+STSaleID.Caption);
       Writeln(F,'日期:'+STSaleDate.Caption+ '  时间:'+FormatDateTime('hh:mm:ss', Now));
       Writeln(F,'--------------------------------');
       //         12345678901234567890123456789012
       Writeln(F,'商品名称         数量 单价  金额');   ADSSaleList.DisableControls;
       ADSSaleList.First;
       while not ADSSaleList.Eof do
       begin
         MerName:=ADSSaleList.FieldValues['MerName'];
         len:=Length(MerName);
         if len < 18 then
           MerName:=MerName+StringOfChar(' ', 18-len);
         if (len mod 2) = 0 then
           Write(F, Copy(MerName, 1, 18))
         else
           Write(F, (Copy(MerName, 1, 17)+' '):18);
         Write(F, ADSSaleList.FieldValues['Qty']:2);
         Write(F, FormatFloat('0.0', ADSSaleList.FieldValues['Price']):6);
         Writeln(F, FormatFloat('0.0', ADSSaleList.FieldValues['Amount']):6);
         ADSSaleList.Next;
       end;
       ADSSaleList.EnableControls;   Writeln(F,'--------------------------------');
       Writeln(F,'合计:',STHj.Caption:8, '    让利:', STRl.Caption:8);
       Writeln(F,'实收:',STSs.Caption:8, '    金卡:',
               FormatCurr('0.00', CardPayment):8
               );
       Writeln(F,'现金:',
               FormatCurr('0.00', StrToCurr(EdCash.Text)-CardPayment):8,
               '    找补:', STBack.Caption:8
               );
       Writeln(F,' '); //空行,添加或减少空行即可控制出纸多少。
       ...
       PrintFile(Outfile); // 输出文件到打印口 输出如下例:    XX化妆品世界购物清单
    --------------------------------
    收银员:01        单号:000000329
    日期:2003-07-16  时间:17:53:28
    --------------------------------
    商品名称         数量 单价  金额
    8g华美健强力消痘乳 4  16.0  64.0
    小口红             1   5.0   5.0
    180g隆力奇蛇胆不紧 3  20.8  62.4
    速效脱毛露         2   7.5  15.0
    美容海藻面膜       3  18.0  54.0
    蕾琪唇彩           1  12.0  12.0 
    .....
    --------------------------------
    合计: 2058.40    让利:    0.00
    实收: 2058.40    金卡:    0.00
    现金: 2100.00    找补:   41.60
    因宽度只有58mm,故商品名切去部分。  
      

  2.   

    我在上面的程序基础上修改成自己需要的小票打印,
    调试的时候发现,一直通不过,后来才发现.....那里把CloseFile(outputfile)给省略了。
    现在终于可以了。:-)
    想要用上面程序的朋友,记得加上CloseFile(outputfile)。
      

  3.   

    如果没有装打印机的话,怎样让它跳出
    // 向LPT口打印一个文本文件
    procedure TPosFrm.PrintFile(AFileToPrint: string);
    var
     Port, FileToPrint: TextFile;
     ALine: string;
    begin
     AssignFile(FileToPrint, AFileToPrint);
     Reset(FileToprint);
     AssignFile(Port, 'LPT1');
     Rewrite(Port);
     while not Eof(FileToPrint) do
     begin
       Readln(FileToPrint, ALine);
       Writeln(Port, ALine);
     end;
     CloseFile(Port);
     CloseFile(FileToPrint);
    end;这段程序?不然程序无响印了.
      

  4.   

    楼上大侠,如果小票打印机是没有带硬字库的怎么打呢?如EPSON 210PD。
      

  5.   

    回复人: XdxDaxiong(小洪) ( ) 信誉:100  2003-10-18 16:08:00  得分:0 
     
     
      楼上大侠,如果小票打印机是没有带硬字库的怎么打呢?如EPSON 210PD。
     
     有两种方式:一是利用驱动,这样的话,楼上的方式就不行了,必须是利用windows打印。需要利用windows打印函数,或者报表工具来打印。
                二是采用图形方式打印,利用windows自带或者ucdos带的字库。把每个汉字转换成图形点阵字符串,然后用楼上的方式发送给打印机。
      

  6.   

    我执行倒Reset(FileToprint);就出错了,i/o错误,怎么回事?
      

  7.   

    我直接使用报表QuickReport输出报表,没有问题。
      

  8.   

    呵呵,原来就是CloseFile没有得缘故。笨 :)
      

  9.   

    我想把内容输出到文件[txt文件],然后打印该文件,如何改变字体?改变字体的大小其实是为了打印出来的字体大一点而已。有没有办法在程序里控制呢?如果可以改变字体,输出为别的格式也没关系 
      

  10.   

    一般是用串口的,发送微打控制指令就可以了。http://218.56.11.178:8020/web/index.aspx->下载基地->例程-硬件控制->串口通讯控制器         ->控件-硬件控制->TurboPower Async Professional
      

  11.   

    微机打印哦,那里有lpt口哦,
    用COM发送,怎么作啊.
      

  12.   

    对啊,不知谁 有解决字体大小的问题呢
    我以前用报表作打作,在98可以,可2000不行了,所有的报表纸张大小在程序中设完后,2000不承认,以上代码中CloseFile(outputfile)。不必了
    因我在函数中已 有了呀CloseFile(FileToPrint);
    所以不必再关必一次
      

  13.   

    这个问题好像大家解决得差不多了,我就不插嘴了,最近我也做这个东西,是直接打印的,控制钱箱时没反应,大家遇到过吗?钱箱是打印机驱动的
    Var F:TextFile;
    PDStr:string;
    begin
      AssignFile(F, 'LPT1');
      Rewrite(F);
      //初始化
      PDStr:=chr(27)+chr(64);
      Write(F, PDStr);
      //开钱箱
      PDStr:= Chr(27)+'p'+Chr(0)+Chr(60)+Chr(255);
      Write(F, PDStr);
      CloseFile(F);