Почему при использовании прямой печати усекаются строки? - PullRequest
4 голосов
/ 09 мая 2011

Я пытаюсь печатать напрямую на принтер с помощью команд 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 WriteString function:

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

Ответы [ 2 ]

4 голосов
/ 09 мая 2011

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

4 голосов
/ 09 мая 2011

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

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

...