Почему строки усекаются при использовании прямой печати?

#delphi #printing #epson

#delphi #печать #epson

Вопрос:

Я пытаюсь печатать непосредственно на принтере с помощью команд esc / p (EPSON TM-T70) без использования драйвера принтера. Код найден здесь.

Однако, если я пытаюсь напечатать какие-либо строки, они усекаются. Например:

 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 unit 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, что правильно. Почему это так действует?

Ответ №1:

Вы используете версию Delphi с поддержкой Unicode. Длина символов составляет 2 байта. Когда вы вызываете свою функцию с Length(s) , вы отправляете количество символов, но функция, вероятно, ожидает размер буфера. Замените его на Размер (ы) Length(s)*SizeOf(Char) .

Поскольку размер одного символа Юникода составляет ровно 2 байта, при отправке, Length когда требуется размер буфера, вы, по сути, указываете API использовать только половину буфера. Следовательно, все строки примерно разделяются пополам.

Комментарии:

1. Спасибо за ваш ответ. SizeOf дал мне значение 4 (размер строки?), поэтому строка была еще более усеченной. Но когда я увеличил длину на 2, тогда все в порядке. Я принимаю ваш ответ, поскольку он привел меня к решению. Еще раз спасибо

Ответ №2:

Возможно, вы можете использовать функцию byteLength, которая выдает длину строки в байтах.

Комментарии:

1. 1 Это то, что я искал, но не смог его найти. Конечно, это реализовано как Length(S) * SizeOf(Char) , но выглядит чище и намного лучше выражает концепцию длины буфера.