#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)
, но выглядит чище и намного лучше выражает концепцию длины буфера.