一个应用程序,送出一条打印命令(wordapplication1.printout;)之后
如何判断打印机的工作已经正确完成,或者未打印成功

解决方案 »

  1.   

    var 
    pinfo: pPRINTERINFO2; 
    pprt,a: Cardinal; 
    b:PDWORD; 
    begin 
    b:=allocmem(256); 
    pinfo:=AllocMem(1000); 
    if OpenPrinter('HP DJ 200',pprt,nil) then 
    begin 
    a:=1000; 
    if getprinter(pprt,2,pinfo,a,b) then 
    showmessage(pinfo.pPrinterName+' ststus:'+inttostr(pinfo.Status)); 
    ClosePrinter(pprt); 
    end; freemem(b); 
    freemem(pinfo); 
    end; PRINTER_INFO_2.Status : 
    Windows NT: 
    PRINTER_STATUS_PAUSED 
    PRINTER_STATUS_PENDING_DELETION 
    Windows 95: 
    PRINTER_STATUS_BUSY 
    PRINTER_STATUS_DOOR_OPEN 
    PRINTER_STATUS_ERROR 
    PRINTER_STATUS_INITIALIZING 
    PRINTER_STATUS_IO_ACTIVE 
    PRINTER_STATUS_MANUAL_FEED 
    PRINTER_STATUS_NO_TONER 
    PRINTER_STATUS_NOT_AVAILABLE 
    PRINTER_STATUS_OFFLINE 
    PRINTER_STATUS_OUT_OF_MEMORY 
    PRINTER_STATUS_OUTPUT_BIN_FULL 
    PRINTER_STATUS_PAGE_PUNT 
    PRINTER_STATUS_PAPER_JAM 
    PRINTER_STATUS_PAPER_OUT 
    PRINTER_STATUS_PAPER_PROBLEM 
    PRINTER_STATUS_PAUSED 
    PRINTER_STATUS_PENDING_DELETION 
    PRINTER_STATUS_PRINTING 
    PRINTER_STATUS_PROCESSING 
    PRINTER_STATUS_TONER_LOW 
    PRINTER_STATUS_UNAVAILABLE 
    PRINTER_STATUS_USER_INTERVENTION 
    PRINTER_STATUS_WAITING 
    PRINTER_STATUS_WARMING_UP 
    ////////////////////////////////////////////////////////////////// 
    unit PrinterStatus; interface uses 
    Windows, Messages, WinProcs, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; 
    // TPrinterstatus 
    // Komponente zum Abfragen des aktuellen Druckerportstatus 
    // Programmiert 2000 von K. Otto 
    // funktioniert unter Win 9x, jedoch nicht unter Win NT 
    // --------------------------------- 
    // Status: Freeware incl. Sourcecode 
    // --------------------------------- 
    // Diese Komponente beruht auf einem Beitrag von Robert Vivrette 
    // f黵 "The unofficial Newsletter of Delphi Users" 
    // http://www.undu.com/articles/990228a.html type 
    TPrinterStatus = class(TComponent) 
    private 
    { Private-Deklarationen } 
    fStatus : Byte; 
    fLPT : Integer; 
    Function GetTimeOut : Boolean; 
    Function GetIOError : Boolean; 
    Function GetPrinterSelected : Boolean; 
    Function GetOutOfPaper : Boolean; 
    Function GetAcknowledgement : Boolean; 
    Function GetPrinterBusy : Boolean; 
    protected 
    { Protected-Deklarationen } 
    public 
    { Public-Deklarationen } 
    Procedure CheckPrinterStatus; // Liest den Druckerstatus der angegeben LPT-Schnittstelle 
    Constructor Create(AOwner : TComponent); Override; 
    Property TimeOut : Boolean Read GetTimeOut; 
    Property IOError : Boolean Read GetIOError; 
    Property PrinterSelected : Boolean Read GetPrinterSelected; 
    Property OutOfPaper : Boolean Read GetOutOfPaper; 
    Property Acknowledgement : Boolean Read GetAcknowledgement; 
    Property Busy : Boolean Read GetPrinterBusy; 
    published 
    { Published-Deklarationen } 
    Property LPT : Integer Read fLPT Write fLPT; 
    end; procedure Register; implementation procedure Register; 
    begin 
    RegisterComponents('Eigene', [TPrinterStatus]); 
    end; Function TPrinterStatus.GetTimeOut : Boolean; 
    Begin 
    Result:=(fStatus and $01)=$01; 
    End; Function TPrinterStatus.GetIOError : Boolean; 
    Begin 
    Result:=(fStatus and $08)=$08; 
    End; Function TPrinterStatus.GetPrinterSelected : Boolean; 
    Begin 
    Result:=(fStatus and $10)=$10; 
    End; Function TPrinterStatus.GetOutOfPaper : Boolean; 
    Begin 
    Result:=(fStatus and $20)=$20; 
    End; Function TPrinterStatus.GetAcknowledgement : Boolean; 
    Begin 
    Result:=(fStatus and $40)=$40; 
    End; Function TPrinterStatus.GetPrinterBusy : Boolean; 
    Begin 
    Result:=not ((fStatus and $80)=$80); 
    End; Procedure TPrinterStatus.CheckPrinterStatus; 
    Var 
    Status : Byte; 
    CheckLPT : Word; 
    Begin 
    Status:=0; 
    If (fLPT>=1) and (fLPT<=3) Then 
    Begin 
    CheckLPT:=fLPT-1; 
    asm 
    mov dx,CheckLPT; 
    mov al,0; 
    mov ah,2; 
    int 17h; 
    mov &Status, ah; 
    End; 
    End; 
    fStatus:=Status; 
    End; Constructor TPrinterStatus.Create(AOwner : TComponent); 
    Begin 
    Inherited Create(AOwner); 
    fLPT:=1; 
    fStatus:=0; 
    End; end. 
    ////////////////////////////////////////////////////// 
    用法: if not PrinterStatus1.PrinterReady(0) then //0 = current printerport 
    ShowMessage(PrinterStatus1.StatusMsg) else {print print print} ; unit PrinterStatus; interface uses 
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type 
    TPrinterStatus = class(TComponent) 
    private 
    { Private declarations } 
    FPort : Word; 
    FStatusStr : string; 
    protected 
    { Protected declarations } 
    public 
    { Public declarations } 
    function PrinterReady(LPT: Word): boolean; 
    published 
    { Published declarations } 
    property StatusMsg: string read FStatusStr; 
    end; procedure Register; implementation 
    uses Printers; procedure Register; 
    begin 
    RegisterComponents('Win95', [TPrinterStatus]); 
    end; const 
    PrnReady = $90; 
    OffLine = $00; 
    OffLine2 = $10; {NEW LINE} 
    PaperOut = $20; 
    PaperOut2 = $30; {NEW LINE} 
    HookedButOff = $80; {NEW LINE} 
    NoConnect = $B0; {MODIFIED LINE} {NOCONNECT = $30 FOR SOME COMPUTERS BY STU} function TPrinterStatus.PrinterReady(LPT: Word): boolean; 
    var 
    ErrorCode, C : BYTE; 
    code, x : integer; 
    s : string; function GetPrinterStatus (LPT: Word): Byte; 
    {Pass 1 in LPT for LPT1} 
    begin 
    asm 
    mov ah,2 
    mov dx,LPT 
    dec dx 
    int $17 
    mov @Result,ah 
    end; 
    end; {GetPrinterStatus} 
    begin 
    result := false; //assume not FPort := LPT; 
    if FPort = 0 then begin {if no port specified then try to set port to current 
    printer port} 
    {printer name} 
    s := Printer.Printers[Printer.PrinterIndex]; 
    if Pos('FPort',s) <> 0 then begin 
    s := Copy(s, Pos('FPort',s) +3, 1); 
    Val(s,x,code); 
    if code <> 0 then FPort := 1 else FPort := x; 
    end else FPort := 1; {default to LPT1} 
    end; {valid LPT is 1..4} 
    if (FPort > 4) or (FPort < 1) then begin 
    raise ERangeError.CreateFmt( 
    'LPT%d is not within the valid range of %d..%d', 
    [FPort, 1, 4]); 
    exit; 
    end; 
    ErrorCode := GetPrinterStatus(FPort); ErrorCode := ErrorCode and $B0; {NEW LINE} C := ERRORCODE shl 6; {ALWAYS MEANS NOTHING CONNECTED} if C > 0 then ERRORCODE := $B0; {ELEMINATES NO LPT3 AND NOTHING CONNECTED} case ErrorCode of 
    PrnReady : begin FStatusStr := 'Printer Ready'; result := true; 
    end; 
    NoConnect : FStatusStr := 'Printer not connected'; 
    Offline,OffLine2 : FStatusStr := 'Printer off line'; {Modified} 
    PaperOut,PaperOut2 : FStatusStr := 'Printer out of paper'; {Modified} 
    HookedButOff : FStatusStr := 'Printer connected but turned off'; {New} 
    else 
    FStatusStr := 'Printer error code: ' + IntToStr(ErrorCode); 
    end; end; 
    end.