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只使用一半的缓冲区.因此,所有字符串都大致分成两半. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |