我正在尝试使用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,这是正确的。为什么会这样呢?
答案 0 :(得分:4)
您使用的是启用了unicode的Delphi版本。字符长度为2个字节。当您使用Length(s)
调用函数时,您将发送字符数,但该函数可能需要缓冲区的大小。将其替换为 SizeOf(s) Length(s)*SizeOf(Char)
。
由于一个unicode char的大小恰好是2个字节,当你需要缓冲区大小时发送Length
时,你实际上是在告诉API只使用一半的缓冲区。因此,所有字符串都大致分成两半。
答案 1 :(得分:4)
也许您可以使用ByteLength函数,该函数以字节为单位给出字符串的长度。