现在用到pos58打印机
想问一下
那种超市的那种小票是怎么打印出来的?
最好有源码
谢谢赐教
不胜感激
有人说是用报表 有人说什么硬字库
都怎么实现?
14 个解决方案
#1
我以前做的程序中,打印的小票,一票都保存在一个文本中,因为有的客户会需要重新打印小票等。
然后用画布直接输出到打印机打印。
也可以用rave或quickreport来打印。
然后用画布直接输出到打印机打印。
也可以用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;
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;
如果引用打印指令直接写口效率应该会更快点,不过热敏打印机速度不是问题.
要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的一样.
直接写口对打印机控制的更灵活方便一些
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
实际上怎么可以控制字符的放大????
但不知道实际上怎么用
比如说有说 设置字符的倍宽,倍高打印
FS !
----------------
格式:
ascii码:FS ! n
十进制: 28 33 n
实际上怎么可以控制字符的放大????
#12
请问如果是B/S结构的,用ASP写的代码,怎么打印到小票上呢?
#13
lz要干嘛?
#14
就是做报表
#1
我以前做的程序中,打印的小票,一票都保存在一个文本中,因为有的客户会需要重新打印小票等。
然后用画布直接输出到打印机打印。
也可以用rave或quickreport来打印。
然后用画布直接输出到打印机打印。
也可以用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;
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;
如果引用打印指令直接写口效率应该会更快点,不过热敏打印机速度不是问题.
要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的一样.
直接写口对打印机控制的更灵活方便一些
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
实际上怎么可以控制字符的放大????
但不知道实际上怎么用
比如说有说 设置字符的倍宽,倍高打印
FS !
----------------
格式:
ascii码:FS ! n
十进制: 28 33 n
实际上怎么可以控制字符的放大????
#12
请问如果是B/S结构的,用ASP写的代码,怎么打印到小票上呢?
#13
lz要干嘛?
#14
就是做报表