Я использовал блок CharPrinter.pas для отправки команд в ZPLII для принтера ZEBRA в Delphi RAD2007, и все сработало хорошо, но я перехожу на XE7 и пытаюсь использовать те же функции и отправлять на принтер и не работает и не дает сообщений об ошибках. Нужно ли выполнять новые типы данных XE?CharPrinter в принтере ZEBRA XE7
ответ
Это произошло, потому что Delphi переключился на строки Unicode в Delphi 2009. Строки Unicode используют 2 байта для каждого символа. Использованы старые версии Delphi 1 байт для каждого символа.
Поэтому вы должны внести некоторые изменения в ChatPrinter.pas.
Попробуйте изменить этот (не проверено):
procedure TCharPrinter.SendData (aData : String);
var
Data : array[0..255] of char;
cnt : integer;
ss : TStringStream;
begin
try
ss := TStringStream.Create(aData,TEncoding.ANSI);
fStream.CopyFrom (ss,0);
finally
ss.Free;
end;
// for cnt := 0 to length(aData) - 1
// do Data[cnt] := aData[cnt+1];
end;
Или проще:
procedure TCharPrinter.SendData (aData : String);
var
Data : AnsiString;
begin
Data := AnsiString(aData);
fStream.Write(PAnsiChar(Data)^, Length(Data));
end;
Этот код можно упростить, назначив 'aData' локальной переменной' AnsiString' 'aStr', а затем записать ее в поток, используя' fStream.Write (PAnsiChar (aStr) ^, Length (aStr)); '. Я немного удивлен, что исходный код до Unicode уже не делал этого, во-первых, не было причин для копирования ввода 'String' в локальный массив' Char [] 'перед его написанием. –
Да, вы правы, спасибо за редактирование –
Большое спасибо! Решение, которое вы сообщили, прекрасно работает - Реми Лебо и Шади Аджам – DevDelphi
Может быть очень хорошо. Если вы говорите о [этой CharPrinter.pas] (https://github.com/celioeduardo/delphi-sistemas/blob/master/Comum/Generico/CharPrinter.pas), то оно имеет последнее обновление где-то около Delphi 7, поэтому он не получил ни одной из версий unicode более высоких версий. Поскольку он работает с потоками, он может легко прекратить делать что-либо, когда он встречает первый # 0, который является частью многобайтового символа. – GolezTrol