【问题标题】:Why are strings truncated when using direct printing?为什么使用直接打印时字符串会被截断?
【发布时间】:2011-08-21 11:39:02
【问题描述】:

我正在尝试使用 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;

只会打印“This isThis is”!我通常不会使用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,这是正确的。为什么会这样?

【问题讨论】:

    标签: delphi printing epson


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。 SizeOf 给了我值 4(字符串的大小?),所以字符串被截断了。但是当我将长度与 2 相乘时,一切正常。我接受您的回答,因为这使我找到了解决方案。再次感谢
    【解决方案2】:

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

    【讨论】:

    • +1 这就是我一直在寻找但未能找到的东西。当然,它被实现为Length(S) * SizeOf(Char),但它看起来确实更简洁,并且更好地表达了缓冲区长度的概念。
    猜你喜欢
    • 2015-12-20
    • 1970-01-01
    • 2010-11-21
    • 2015-07-31
    • 1970-01-01
    • 2018-01-29
    • 2018-10-25
    • 2016-11-25
    • 1970-01-01
    相关资源
    最近更新 更多