Ваш текущий код отправляет данные на принтер в неправильном формате из-за изменений между символами Ansi и Unicode. Принтер, который вы используете, очевидно, способен допускать некоторое количество ошибок, поэтому некоторые ваши команды работали, но есть ограничение.
В вашей версии Delphi Char
эквивалентно WideChar
, поэтому измените код Char
, чтобы вместо него использовать AnsiChar
, чтобы вы могли отправлять однобайтовые символы, как того ожидает принтер. Ваша PrintRawData
функция была в порядке раньше. Ваше изменение неверно. Принтер не ожидает получения двухбайтовых символов Юникода, но это то, что составляет ваше изменение.
После восстановления исходного кода PrintRawData
измените функцию SendStr
на:
procedure TMainWindow.SendStr(const Text: string);
var
data: AnsiString;
begin
data := Text;
if (PrintRawData(printHandle,
PAnsiChar(data),
Length(data)) < 0) then begin
ShowMessage('PrintRawData Failed');
EndRawPrintPage(printHandle);
EndRawPrintJob(printHandle);
end;
end;
Я внес следующие изменения в код:
- Заменить массив
Char
на AnsiString
.
- Вместо того, чтобы увеличивать массив данных по одному символу за раз с помощью цикла, выполните преобразование Unicode-в-Ansi с помощью одного оператора присваивания и позвольте RTL позаботиться о преобразовании.
- Введите строку данных в
PAnsiChar
для передачи в PrintRawData
.
- Передайте строковые параметры как const, если вам не нужно изменять их содержимое.
- Нет необходимости в явном выражении
exit
, когда функция уже завершена.