quick report 에서 네트워크 프린터로 프린터할려구 하는데
네트워크컴퓨터가 켜져있으면 프린터가 잘됩니다..
만약..네트워크컴퓨터가 꺼져있거나 제컴퓨터의 렌선을 뽑은후
프로그램에서 출력하면 프로그램이 바로
에러메세지 출력후 죽어버려요..
혹시 프로그램 문제인가해서 그냥 폼하나에 리포트폼하나만 추가하고
실행해 봐두 마찬가지네요..
네트워크컴퓨터 출력시 이런 문제가 있나보던데..어떻게 해결하는방법이
업을까요??
많은 조언부탁합니다.
예외처리 exception 을 걸어도 이런 문제에선 아예걸리지가 않네요..
ㅠ.ㅠ
네트워크프린터가 끄져도 아무렇지 않던데요. 아마도 Windows
문제인것 같아요. 저는 2000serve를 사용하는데 한번씩 프린터할
때 뻗어버립니다. Win98에서는 아무렇지 않던데. 메모리 문젠가 ?
다른 컴퓨터에서도 해보셨나요?
아무튼 프린터하기전에 프린터상태를 체크한후 'ready' 상태일
경우에만 프린터하면 되겠군요. 프린터상태를 체크하는 콤프넌트
인데 아래와 같이 해보세요. (저도 어디서 퍼왔는데 출처는 모름)
----------------------------------------------------------
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('sirius', [TPrinterStatus]);
end;
const
PrnReady = $90;
OffLine = $00;
OffLine2 = $10;
PaperOut = $20;
PaperOut2 = $30;
HookedButOff = $80;
NoConnect = $B0;
function TPrinterStatus.PrinterReady(LPT: Word): boolean;
var
ErrorCode, C : BYTE;
code, x : integer;
s : string;
function GetPrinterStatus (LPT: Word): Byte;
begin
asm
mov ah,2
mov dx,LPT
dec dx
int $17
mov @Result,ah
end;
end;
begin
result := false;
Fport := LPT;
if Fport = 0 then begin
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;
end;
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;
C := ERRORCODE shl 6;
if C > 0 then ERRORCODE := $B0;
case ErrorCode of
PrnReady : begin
FStatusStr := 'Printer Ready'; result := true;
end;
NoConnect : FStatusStr := 'Printer not connected';
Offline,OffLine2 : FStatusStr := 'Printer off line';
PaperOut,PaperOut2 : FStatusStr := 'Printer out of paper';
HookedButOff : FStatusStr := 'Printer connected but turned off';
else
FStatusStr := 'Printer error code: ' + IntToStr(ErrorCode);
end;
end;
end.
위의 소스를 참고하시고요...
이 콤포의 사용방법은 간단합니다...
If not PrinterStatus1.PrinterReady(0) then //0 = 현재 프린터 포트
ShowMessage(PrinterStatus1.StatusMsg)
else
// 프린트를 한다...
--------------------------------------------------------------