2011-09-28 184 views
3

我需要從打印機獲取紙張狀態信息。我有一個esc/pos命令列表。 我試圖與逃生功能發送這些命令對應檢測打印機紙張的狀態

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我總是得到相同的字符串.... 你能給我一個最後一個參數不是nill的逃生函數的例子? 獲取紙張狀態的替代方法?

+0

難道我讀正確buffout? – user817057

回答

3

我想你正在使用上面的Delphi 2009,並且你使用this source作爲例子,所以你的問題可能是由Unicode參數引起的。在德爾福自2009版以來,string類型被定義爲UnicodeString,而在德爾福2009年下面作爲AnsiStringChar也是,在德爾福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;