epson代码被误读为字符串输出

时间:2018-04-10 12:52:30

标签: delphi epson delphi-10.2-tokyo

使用Delphi Tokyo中的Epson代码进行打印。 函数PrintRawData(内置于Winapi.Winspool库)似乎误读了'ESC C'或'ESC @'等代码并打印'C'和'@'而不是与所述代码相关的提示(选择页面长度和初始化打印机) )。

procedure TFrmPrint.PageLen(hPrn : THandle); // Page length in Inches
var
  Commalist     :       Array[1..20] of SmallInt;
  istart, icomma, i   :   SmallInt;
  ss, cr   :   UTF8String;
  def   :   UTF8String;
  Data  :   Array [0..255] of AnsiChar;
begin
  ss := '';
  cr := '  ';
  cr[1] := #13; cr[2] := #10;

  if not DM2.Q_PRNGen.Locate('PrAction','PAGELENIN',[loCaseInsensitive]) then
  begin
    ShowMessage('PAGELENIN Action not coded for Printer');
    exit;
  end;
  ss := Trim(DM2.Q_PRNGen.Fields.FieldByName('ESCCODE').AsString);

  icomma := 0;
  istart := 1;
  for i:=1 to Length(ss) do
  begin
    if ss[i] = ',' then
    begin
      inc(icomma);
      Commalist[icomma] := StrToIntDef(Copy(ss,istart,i-istart),0);
      istart := i + 1;
    end;
  end;
  inc(icomma);
  i := Length(ss);
  Commalist[icomma] := StrToIntDef(Copy(ss,istart,i-istart+1),0);

  def := '';
  for i:=1 to icomma do
  begin
    def := def + ' ';
    def[i] := AnsiChar(CommaList[i]);
//    def := Def + IntToHex(CommaList[i],1);

  end;

//  ss := def + cr;
  ss := def;
  for i:=1 to Length(ss) do Data[i-1] := AnsiChar(ss[i]);
  if frmPrint.PrintRawData(hPrn,@Data,Length(ss)) < 0 then
  begin
    ShowMessage('PrintRawData Failed');
    frmPrint.EndRawPrintPage(hPrn);
    frmPrint.EndRawPrintJob(hPrn);
    exit;
  end;
end;

我认为错误在于PrintRawData。 PrintRawData列于此处:

function TFrmPrint.PrintRawData(hPrn : THandle; Buffer : pointer;  NumBytes : SpoolInt) : integer;
var
  BytesWritten : DWORD;
begin
  if NumBytes = 0 then
  begin
    Result := 1;
    exit;
  end;
  if not WritePrinter(hPrn, Buffer, NumBytes, BytesWritten) then
  begin
     Result := -1;
     exit;
  end;
  if NumBytes <> BytesWritten then
  begin
    Result := -1;
    exit;
  end;
  Result := 1;
end;

0 个答案:

没有答案