如下程序,结果为:“&欢&迎&光&临”(第一行),为什么会多出"&",怎样去掉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;

解决方案 »

  1.   


                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, 是一个意思(具体意义不想查手册了),没出现问题。打印机型号不同有些指令可能微有区别!!
      

  2.   

    我想实现汉字横向扩大4倍,纵向扩大2倍;字符扩大4倍。该怎么写呢?
    用以下这种方式:
    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拜托楼上的啦!
      

  3.   

    SendToPrinter([$1C,$69,$1c,$57,0,ord(SendBuf[i]),ord(SendBuf[i+1])]);   //中文四倍是$69,不是$26
      

  4.   

    我想实现汉字横向扩大4倍,纵向扩大2倍;
      --> 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 倍。
      

  5.   

    结贴吧,最后结果
    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;