中国程序员联盟 正在重新改版中ing 不便之处还请见谅 改版后将内容涉及java delphi .net php
 
  首页 | 数据库开发 | 网络通讯 | 多线程 | 多媒体开发 | 图像处理 | 程序人生 | 系统函数 | 控件开发 | Web服务
 
  当前位置:笨鱼delphi技术网>数据库开发>打印报表>文章内容

delphi 获取打印机状态

来源:站内 关于:bill 发布时间:2007-06-23   [收藏] [推荐]

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;


[浏览: 次]   
上一篇:delphi 安装打印驱动   下一篇:delphi 打印时改变纸张大小
[收藏] [推荐] [返回顶部] [打印本页] [关闭窗口]  
    评论加载中…
google adsense热点文章
·delphi 打印时改变纸张大小
·delphi 判断打印机能否打印的PostScrip
·delphi 检测存在打印机
·delphi Tmemo,TstringList,Tstrings打
·delphi 如何保存打印机信息到注册表
·delphi 判断系统是否有打印机连接
·delphi 在打印中间改变打印设置
·delphi 使用打印机内置字体打印
·delphi 获取打印驱动,打印端口名
·delphi 改变打印机的打印端口
·delphi 打印LabelsVCL组件
·delphi 如何发二进制字符到打印机
     delphi技术网 | firefox 下载 | Avant Browser下载 | dedecms 技术网 | drupal 爱好者 | php 技术网
  Copyright@www.delphichm.com,2006-2009.All Rights Reserved.
 
程序员联盟 | delphi Java .net|QQ:707102932