如下程序,结果为:“&欢&迎&光&临”(第一行),为什么会多出"&",怎样去掉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;
解决方案 »
- text,htm(内容全是文本)的操作方法是不是一样的.
- 2000下,我做了一个程序,可以随着2000启动自动启动,但这个程序需要连接数据库,有时候程序启动好后,数据库还没启动好,就会连接失败,
- Excel问题!急!急!
- 如何禁止一个文本框获取焦点?
- CORBA三层数据结构应用,CorbaConnection错误
- delphi7中的InterBaseServer问题
- 关于RAVE的做报表的问题!
- 声音问题:(有点难度)欢迎大虾光临,具体如下:(请进!!!)
- 如何把Tdbgrid选择的行中的具体某个格中的数据,表示出来?
- 请教如何利用DELPHI 开发DOS 环境下的应用程序?????????????
- 插入数据库的问题
- 各位大虾请教下面一个问题,希望有能力者帮小弟尽快解决,有劳各位了
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;