Я полагаю, что вы используете Delphi 2009 выше, и вы использовали this source
для вашего примера, поэтому ваша проблема может быть вызвана параметрами Unicode. В Delphi начиная с версии 2009 тип string
определен как UnicodeString
, а в Delphi 2009 ниже - AnsiString
, то же самое относится и к Char
, что составляет WideChar
в Delphi 2009 вверх и AnsiChar
ниже.
Если это так, то я думаю, что у вас есть проблема, по крайней мере, с вашей длиной данных буфера, потому что Char = WideChar
занимает 2 байта, и вы использовали функцию StrLen
, которая возвращает количество символов, которые не могут соответствуют размеру данных number of chars * 2 bytes
.
Я надеюсь, что это решит вашу проблему, но я не могу проверить это, потому что у меня нет вашего принтера:)
type
TPrinterData = record
DataLength: Word;
Data: array [0..255] of AnsiChar; // let's use 1 byte long AnsiChar
end;
function Convert(const S: AnsiString): string;
var
I: Integer; // 32-bit integer is more efficient than 8-bit byte type
T: string; // here we keep the native string data type
begin
T := '';
for I := 1 to Length(S) do
T := T + IntToHex(Ord(S[I]), 2) + ' ';
Result := T;
end;
procedure TFTestStampa.SpeedButton2Click(Sender: TObject);
var
TestInt: Integer;
Command: AnsiString;
BufferIn: TPrinterData;
BufferOut: TPrinterData;
begin
Printer.BeginDoc;
try
TestInt := PASSTHROUGH;
if Escape(Printer.Handle, QUERYESCSUPPORT, SizeOf(TestInt), @TestInt, nil) > 0 then
begin
Command := Chr(10) + Chr(04) + '4';
StrPCopy(BufferIn.Data, Command);
BufferIn.DataLength := StrLen(Command);
FillChar(BufferOut.Data, Length(BufferOut.Data), #0);
BufferOut.DataLength := 0;
Escape(Printer.Canvas.Handle, PASSTHROUGH, 0, @BufferIn, @BufferOut);
ShowMessage(Convert(StrPas(BufferOut.Data)));
end
finally
Printer.EndDoc;
end;
end;