Определить состояние бумаги для принтера - PullRequest
3 голосов
/ 28 сентября 2011

Мне нужно получить информацию о состоянии бумаги с принтера.У меня есть список команд esc / pos.Я пытаюсь отправить эти команды с функцией escape

http://msdn.microsoft.com/en-us/library/windows/desktop/dd162701%28v=vs.85%29.aspx

Это мой код

type
TPrnBuffRec = record
  bufflength: Word;
  Buff_1: array[0..255] of Char;
end;

procedure TFTestStampa.SpeedButton2Click(Sender: TObject);
var
  Buff: TPrnBuffRec;
  BuffOut: TPrnBuffRec;
  TestInt: Integer;
  cmd : string;
begin
  printer.BeginDoc;

  try
    TestInt := PassThrough;
    if Escape(Printer.Handle, QUERYESCSUPPORT, SizeOf(TESTINT),
@testint, nil) > 0 then
      begin
        cmd := chr(10) + chr(04) + '4';
        StrPCopy(Buff.Buff_1, cmd);
        Buff.bufflength := StrLen(Buff.Buff_1);
        Escape(Printer.Canvas.Handle, Passthrough, 0, @buff,
@buffOut);

        ShowMessage( conver(strPas(buffOut.Buff_1)) );
      end

  finally
    printer.EndDoc;

end;


function TFTestStampa.Conver(s: string): String;
var
  i:  Byte;
  t : String;
begin
  t := '';
  for i := 1 to Length(s)  do
    t := t + IntToHex(Ord(s[i]), 2) + ' ';
  Result := t;
end; 

Проблема в том, что с разными cmds я всегда получаю одну и ту же строку.... Можете ли вы привести пример функции escape с последним параметром, не ноль?Альтернативы для получения статуса бумаги?

1 Ответ

3 голосов
/ 30 сентября 2011

Я полагаю, что вы используете 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...