如下程序,结果为:“&欢&迎&光&临”(第一行),为什么会多出"&",怎样去掉procedure OpenLptPrn(hp:string);
begin
PRNHwnd:=CreateFile(Pchar(hp), GENERIC_READ or GENERIC_WRITE,0,nil, OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
if PRNHwnd=INVALID_HANDLE_VALUE then
Exception.Create('无效并行口');
end;procedure SendToPrinter(SendBuf:array of byte);overload
var
// tem:cardinal;
tem:longword;
begin
WriteFile(PRNHwnd,SendBuf,length(SendBuf),tem,nil);
end;procedure SendToPrinter0(SendBuf:string);overload
var
i,a:integer;
begin
a:=0;
sendbuf:=trim(sendbuf);
for i:=1 to Length(SendBuf) do
begin
if a=0 then
begin
if (ord(SendBuf[i])>0)and(ord(SendBuf[i])<128) then
begin
SendToPrinter([$1C,$2E,$1C,$57,1,ord(SendBuf[i])]);
// SendToPrinter([ord(SendBuf[i])]);
end
else
begin
SendToPrinter([$1C,$26,$1C,$57,0,ord(SendBuf[i]),ord(SendBuf[i+1])]);
a:=1;
end;
end
else
begin
a:=0;
end;
end;
SendToPrinter([$1C,$2E,ord(' '),$0A]);
end;procedure SendToPrinter1(SendBuf:string);overload
var
i,a:integer;
begin
a:=0;
for i:=1 to Length(SendBuf) do
begin
if a=0 then
begin
if (ord(SendBuf[i])>0)and(ord(SendBuf[i])<128) then
begin
SendToPrinter([$1C,$2E,ord(SendBuf[i])]);
end
else
begin
SendToPrinter([$1C,$26,$1C,$57,1,ord(SendBuf[i]),ord(SendBuf[i+1])]); //中文四倍
a:=1;
end;
end
else
begin
a:=0;
end;
end;
SendToPrinter([$0A]); //换行
end;procedure TForm1.Button1Click(Sender: TObject);
var i:integer;s:string;
begin
OpenLptPrn('lpt1');
SendToPrinter1('欢迎光临');
SendToPrinter0('------------------------------');
SendToPrinter0('12123');
SendToPrinter0(datetostr(date)+' '+timetostr(time));
for i:=0 to 3 do
begin
sendtoprinter([$0A]); //换行
end;
SendToPrinter([$0D,$1B,$69]); //回车,切纸
fileclose(PRNHwnd);
end;
begin
PRNHwnd:=CreateFile(Pchar(hp), GENERIC_READ or GENERIC_WRITE,0,nil, OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
if PRNHwnd=INVALID_HANDLE_VALUE then
Exception.Create('无效并行口');
end;procedure SendToPrinter(SendBuf:array of byte);overload
var
// tem:cardinal;
tem:longword;
begin
WriteFile(PRNHwnd,SendBuf,length(SendBuf),tem,nil);
end;procedure SendToPrinter0(SendBuf:string);overload
var
i,a:integer;
begin
a:=0;
sendbuf:=trim(sendbuf);
for i:=1 to Length(SendBuf) do
begin
if a=0 then
begin
if (ord(SendBuf[i])>0)and(ord(SendBuf[i])<128) then
begin
SendToPrinter([$1C,$2E,$1C,$57,1,ord(SendBuf[i])]);
// SendToPrinter([ord(SendBuf[i])]);
end
else
begin
SendToPrinter([$1C,$26,$1C,$57,0,ord(SendBuf[i]),ord(SendBuf[i+1])]);
a:=1;
end;
end
else
begin
a:=0;
end;
end;
SendToPrinter([$1C,$2E,ord(' '),$0A]);
end;procedure SendToPrinter1(SendBuf:string);overload
var
i,a:integer;
begin
a:=0;
for i:=1 to Length(SendBuf) do
begin
if a=0 then
begin
if (ord(SendBuf[i])>0)and(ord(SendBuf[i])<128) then
begin
SendToPrinter([$1C,$2E,ord(SendBuf[i])]);
end
else
begin
SendToPrinter([$1C,$26,$1C,$57,1,ord(SendBuf[i]),ord(SendBuf[i+1])]); //中文四倍
a:=1;
end;
end
else
begin
a:=0;
end;
end;
SendToPrinter([$0A]); //换行
end;procedure TForm1.Button1Click(Sender: TObject);
var i:integer;s:string;
begin
OpenLptPrn('lpt1');
SendToPrinter1('欢迎光临');
SendToPrinter0('------------------------------');
SendToPrinter0('12123');
SendToPrinter0(datetostr(date)+' '+timetostr(time));
for i:=0 to 3 do
begin
sendtoprinter([$0A]); //换行
end;
SendToPrinter([$0D,$1B,$69]); //回车,切纸
fileclose(PRNHwnd);
end;
begin
SendToPrinter([$1C,$26,$1C,$57,1,ord(SendBuf[i]),ord(SendBuf[i+1])]); //中文四倍
a:=1;
end;
end
你这里用了 $1C$26 我不知这个指令干嘛 但是知道 #$26 = '&' 估计是这里指令打错了其实不必用数组这么麻烦Str := Str + #28#38#29#33#1 + PRN_Re +#$1B#$33#$40#$0D#$0A;俺构成String就可以直接发啦,#28#38#29#33#1 跟你的 $1C,$26, 是一个意思(具体意义不想查手册了),没出现问题。打印机型号不同有些指令可能微有区别!!
用以下这种方式:
SendToPrinter([$1C,$26,$1C,$57,1,ord(SendBuf[i]),ord(SendBuf[i+1])]); //中文四倍命令速查表:
http://www.rd-cn.com/printer/sc.asp
详解命令:
http://www.rd-cn.com/printer/xj.asp拜托楼上的啦!
--> ESC X 04 02
------------------------------------>
ESC X *[ 横向纵向放大不同倍数 ]
格式: ASCII : ESC X n1 n2
十进制: 27 88 n1 n2
十六进制: 1B 58 n1 n2
说明:在该命令之后的字符将以正常宽度的 n1 倍和正常高度的 n2 倍进行打印。 n1 , n2 的值建议设在 1 到 8 之间。上电或初始化后 n1=n2=2 , 既正常的 2 倍。
procedure SendToPrinter1(SendBuf:string);overload
var
i,a:integer;
begin
a:=0;
for i:=1 to Length(SendBuf) do
begin
if a=0 then
begin
if (ord(SendBuf[i])>0)and(ord(SendBuf[i])<128) then
begin
SendToPrinter([$1b,$36,$1b,$57,3,ord(SendBuf[i])]);
end
else
begin
SendToPrinter([$1C,$69,$1B,$69,0,$1B,$58,2,1,ord(SendBuf[i]),ord(SendBuf[i+1])]); //中文四倍
a:=1;
end;
end
else
begin
a:=0;
end;
end;
SendToPrinter([$0A]); //换行
end;