加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:22:31 所属栏目:大数据 来源:网络整理
导读:我正在尝试使用esc / p命令(EPSON TM-T70)直接打印到打印机而不使用打印机驱动程序.代码发现 here. 但是,如果我尝试打印任何字符串,它们将被截断.例如: MyPrinter := TRawPrint.Create(nil);try MyPrinter.DeviceName := 'EPSON TM-T70 Receipt'; MyPrinter
我正在尝试使用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,这是正确的.为什么这样做?

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读