如何获取打印机信息(是否安装了打印机、打印机缺纸、正在打印、打印机有故障)
解决方案 »
- 双击DBGrid1 的一条数据记录 怎样时期记录的各个字段值在另一个 表单里显示出来显示在edit.text里面
- 在广州怎么找工作?在网上投简历都没人理我的。
- 问关于delphi的一个极弱智的问题
- 请教各位,有没有这么一个控件,使应用程序能与SQL交流 图文并茂 的数据,第三方控件也可。
- 没分了,哎问问题都要节约一点
- 我想在程序中控制声音的输入,要求做到程序关闭声音输出(即音箱)不影响声音的输入,因为我要对声音进行录音。
- 写一个关于关于扫描DATABASE控件,并将所有的DATABASE连接到ORACALE上的函数,请各位大虾帮忙
- 有谁试过《程序员》7期李维那篇文章的例子,我试不出来。
- SourceSafe 的中心数据库大概是怎么设计的? 哪位能说说。
- BPL封装窗体问题
- 紧急请教:在delphi中应用unicode的方法及与ansistring的区别,紧急!紧急!紧急!
- 窗体的Destroy和Free过程有什么区别?
begin
ComboBox1.Clear;
ComboBox1.Items.Assign(Printer.Printers);
if ComboBox1.Items.CommaText='' then
Messagedlg('你需要安装打印机才能打印!',mtError,[mbOk],0);
else
Form1.Print;
end;如果你想要改变Windows的缺省打印机,你必须在Windows的WIN.INI中改变设备键。发送一条 WM_WININICHANGE 消息:var
strIni: array[0..MAX_PATH] of Char;
arrWindows: array[0..64] of Char;
begin
GetWindowsDirectory(strIni, SizeOf(strIni));
StrCat(strIni, '\win.ini');
with TIniFile.Create(strIni) do
try
WriteString('windows', 'device', 'HP LaserJet 4 Plus,HPPCL5MS,LPT1:');
finally
Free;
end;
SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, LongInt(@arrWindows));
end;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;interfaceuses
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.htmltype
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;implementationprocedure 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;interfaceuses
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;