超市小票打印是怎么实现

时间:2022-04-11 00:58:40
写一个小的销售软件
现在用到pos58打印机
想问一下 
那种超市的那种小票是怎么打印出来的?
最好有源码
谢谢赐教
不胜感激
有人说是用报表 有人说什么硬字库
都怎么实现?

14 个解决方案

#1


我以前做的程序中,打印的小票,一票都保存在一个文本中,因为有的客户会需要重新打印小票等。
然后用画布直接输出到打印机打印。
也可以用rave或quickreport来打印。

#2


最简单的,做个报表然后打印就好了;你不会是没用过报表吧?

#3


用,fastreport3 可以轻松实现此功能,可以动态控制报表的长度

#4


超市的pos机打印,格式比较简单,建议使用一楼的办法,这样,打印和打印格式生成可以分开实现,会为下面减轻很大的工作量,优点大大的

#5


要是不想学就用现成的傻瓜式的打印套件,如SailPrint,Ehlib组件等

#6


最简单的方法就是直接写串口或者并口

var
  pF : TextFile;
begin
  AssignFile(pF, 'LPT1');
  Rewrite(pF);
  Writeln(pF, '欢迎光临');
  Writeln(pF, '品名    数量    价格    金额');
  Writeln(pF, 切纸命令);
  CloseFile(pF);
end;

#7


楼上的说得不错,一般来说小票格式都很简单,而POS收银机,如IBM的,虽然都有驱动,控件,但用着不爽,一般来说直接写COM口比较快,但如果要对齐格式这类的就不好整了.

#8


给你个例子(打印Memo1里面的内容):
要USES Printers单元

    Printer.BeginDoc;
    for i := 0 to Memo1.Lines.Count - 1 do
    begin
      Printer.Canvas.TextOut(5,i * 30 + 5,Memo1.Lines[i]);
    end;
    Printer.EndDoc;

如果引用打印指令直接写口效率应该会更快点,不过热敏打印机速度不是问题.

#9


function TForm1.OpenPort(sPortName: string): THandle;
var cc: TCOMMCONFIG;
begin
  Result:=CreateFile(PChar(sPortName),GENERIC_READ
         or GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0);
  if Result <= 0 then Exit;
  if Copy(sPortName,1,3) = 'Com' then
  begin
    GetCommState(Result,cc.dcb);
    cc.dcb.BaudRate := CBR_9600;
    cc.dcb.ByteSize := 8;
    cc.dcb.Parity := 0;
    cc.dcb.StopBits := 0;
    if not SetCommState(Result,cc.dcb) then
    begin
      CloseHandle(Result);
      Result:= 0; Exit;
    end;
  end;
end;

procedure TForm1.PrintChar(s: string);
var lrc: LongWord;
begin
  hndComm := OpenPort(Trim(ComboBox1.Text));
  if hndComm > 0 then
    WriteFile(hndComm,PChar(s)^,Length(s),lrc,nil);
  CloseHandle(hndComm);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  PrintChar(#27 + #64);  //初始化打印机
end;

procedure TForm1.XPButton1Click(Sender: TObject);
var i: Integer;
begin
  if Memo1.Text = '' then Exit;

    for i := 0 to Memo1.Lines.Count - 1 do
    begin
      PrintChar(Memo1.Lines[i] + #13 + #10);
      Sleep(20);
    end;
end;

这个例子是研科打印机的,应该和POS58的一样.
直接写口对打印机控制的更灵活方便一些

#10


楼上的 是不是 针对的是 串口的??

要是并口的,该怎么整??

还有就是打印出来的字符的字体 比如说 倍宽 倍高该怎么控制????

#11


打印机说明书上的手册上有写 
但不知道实际上怎么用
比如说有说 设置字符的倍宽,倍高打印
FS !
----------------
格式:
 ascii码:FS  !   n
  十进制: 28  33   n
 

实际上怎么可以控制字符的放大???? 

#12


请问如果是B/S结构的,用ASP写的代码,怎么打印到小票上呢?

#13


lz要干嘛?

#14


就是做报表

#1


我以前做的程序中,打印的小票,一票都保存在一个文本中,因为有的客户会需要重新打印小票等。
然后用画布直接输出到打印机打印。
也可以用rave或quickreport来打印。

#2


最简单的,做个报表然后打印就好了;你不会是没用过报表吧?

#3


用,fastreport3 可以轻松实现此功能,可以动态控制报表的长度

#4


超市的pos机打印,格式比较简单,建议使用一楼的办法,这样,打印和打印格式生成可以分开实现,会为下面减轻很大的工作量,优点大大的

#5


要是不想学就用现成的傻瓜式的打印套件,如SailPrint,Ehlib组件等

#6


最简单的方法就是直接写串口或者并口

var
  pF : TextFile;
begin
  AssignFile(pF, 'LPT1');
  Rewrite(pF);
  Writeln(pF, '欢迎光临');
  Writeln(pF, '品名    数量    价格    金额');
  Writeln(pF, 切纸命令);
  CloseFile(pF);
end;

#7


楼上的说得不错,一般来说小票格式都很简单,而POS收银机,如IBM的,虽然都有驱动,控件,但用着不爽,一般来说直接写COM口比较快,但如果要对齐格式这类的就不好整了.

#8


给你个例子(打印Memo1里面的内容):
要USES Printers单元

    Printer.BeginDoc;
    for i := 0 to Memo1.Lines.Count - 1 do
    begin
      Printer.Canvas.TextOut(5,i * 30 + 5,Memo1.Lines[i]);
    end;
    Printer.EndDoc;

如果引用打印指令直接写口效率应该会更快点,不过热敏打印机速度不是问题.

#9


function TForm1.OpenPort(sPortName: string): THandle;
var cc: TCOMMCONFIG;
begin
  Result:=CreateFile(PChar(sPortName),GENERIC_READ
         or GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0);
  if Result <= 0 then Exit;
  if Copy(sPortName,1,3) = 'Com' then
  begin
    GetCommState(Result,cc.dcb);
    cc.dcb.BaudRate := CBR_9600;
    cc.dcb.ByteSize := 8;
    cc.dcb.Parity := 0;
    cc.dcb.StopBits := 0;
    if not SetCommState(Result,cc.dcb) then
    begin
      CloseHandle(Result);
      Result:= 0; Exit;
    end;
  end;
end;

procedure TForm1.PrintChar(s: string);
var lrc: LongWord;
begin
  hndComm := OpenPort(Trim(ComboBox1.Text));
  if hndComm > 0 then
    WriteFile(hndComm,PChar(s)^,Length(s),lrc,nil);
  CloseHandle(hndComm);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  PrintChar(#27 + #64);  //初始化打印机
end;

procedure TForm1.XPButton1Click(Sender: TObject);
var i: Integer;
begin
  if Memo1.Text = '' then Exit;

    for i := 0 to Memo1.Lines.Count - 1 do
    begin
      PrintChar(Memo1.Lines[i] + #13 + #10);
      Sleep(20);
    end;
end;

这个例子是研科打印机的,应该和POS58的一样.
直接写口对打印机控制的更灵活方便一些

#10


楼上的 是不是 针对的是 串口的??

要是并口的,该怎么整??

还有就是打印出来的字符的字体 比如说 倍宽 倍高该怎么控制????

#11


打印机说明书上的手册上有写 
但不知道实际上怎么用
比如说有说 设置字符的倍宽,倍高打印
FS !
----------------
格式:
 ascii码:FS  !   n
  十进制: 28  33   n
 

实际上怎么可以控制字符的放大???? 

#12


请问如果是B/S结构的,用ASP写的代码,怎么打印到小票上呢?

#13


lz要干嘛?

#14


就是做报表