使用直接打印时为什么会截断字符串?

时间:2011-05-09 07:22:11

标签: delphi printing epson

我正在尝试使用esc / p命令(EPSON TM-T70)直接打印到打印机,而不使用打印机驱动程序。找到代码here

但是,如果我尝试打印任何字符串,它们会被截断。例如:

MyPrinter := TRawPrint.Create(nil);
try
  MyPrinter.DeviceName := 'EPSON TM-T70 Receipt';
  MyPrinter.JobName := 'MyJob';
  if MyPrinter.OpenDevice then
  begin
    MyPrinter.WriteString('This is page 1');
    MyPrinter.NewPage;
    MyPrinter.WriteString('This is page 2');
    MyPrinter.CloseDevice;
  end;
finally
  MyPrinter.Free;
end;

只打印“这就是这个”!我通常不会使用MyPrinter.NewPage发送换行符命令,但无论如何,它为什么会截断字符串?

另请注意RawPrint单元WriteString功能:

Result := False;
if IsOpenDevice then begin
  Result := True;
  if not WritePrinter(hPrinter, PChar(Text), Length(Text), WrittenChars) then begin
    RaiseError(GetLastErrMsg);
    Result := False;
  end;
end;

如果我在那里放置一个断点并逐步执行代码,那么WrittenChars设置为14,这是正确的。为什么会这样呢?

2 个答案:

答案 0 :(得分:4)

您使用的是启用了unicode的Delphi版本。字符长度为2个字节。当您使用Length(s)调用函数时,您将发送字符数,但该函数可能需要缓冲区的大小。将其替换为 SizeOf(s) Length(s)*SizeOf(Char)

由于一个unicode char的大小恰好是2个字节,当你需要缓冲区大小时发送Length时,你实际上是在告诉API只使用一半的缓冲区。因此,所有字符串都大致分成两半。

答案 1 :(得分:4)

也许您可以使用ByteLength函数,该函数以字节为单位给出字符串的长度。