Array
(
)

Como saber se a impressora esta ligada

Debug
   - 29 set 2004

Pessoal, peguei esta dica função no forum para saber se aimpressora esta ligada mas no win xp ela não funciona.
Algum saberia me dizer porque lea não funciona o XP?
Desde já muito obrigado.
Function OnLine(Porta:Word):Boolean;
Const
Portas :Byte = $02;
Var
Res :Byte;
Begin
{ Código em Assembler }
Asm
mov ah,Portas; {Requisita o acesso as portas}
mov dx,Porta;{Define a porta de teste}
Int $17; {Chama a interrupção de Impressora}
mov Res,ah; {Guarda em Res o resultado da operação }
end;
Result := (Res and $80) = $80; {Testa o valor de saída}
End;


Afarias
   - 29 set 2004

Pela arquitetura do NT (por isso NT4, 2000 e XP são mais robustos) que não permite chamadas diretas no hardware. Vc tem q usar a api do SO para fazer qualquer coisa.


T+


Dopi
   - 29 set 2004

Realmente esse código só funciona em Win9x...

Estive tentando fazer isso usando uma Thread e um Intervalo de TimeOut.

+ ou - assim...
#Código


procedure TForm1.Imprimir( Porta, Texto : String; Tempo : Integer );
Var TempoFinal : TDateTime ;
IsTimeOut : Boolean ;
TP : ThreadEnviaLPT ;
begin
TempoFinal := IncMilliSecond(now,Tempo) ;
IsTimeOut := false ;

TP := ThreadEnviaLPT.Create( Porta, Texto ) ;
try
while (not TP.Terminated) and (not IsTimeOut) do
begin
IsTimeOut := (now > TempoFinal) ;
sleep(50) ;
Application.ProcessMessages ;
end ;
finally
TP.Terminate ;
TP.Free ;

if IsTimeOut then
raise Exception.CreateFmt( ´Impressora em: ¬s nao está pronta´,[Edit2.Text]) ;
end ;

end;


A Thread:
#Código

type
ThreadEnviaLPT = class(TThread)
private
{ Private declarations }
fsTexto : String ;
fsPorta : String ;
protected
procedure Execute ; override;
public
constructor Create(Porta,Texto : String) ;
end;

implementation

constructor ThreadEnviaLPT.Create( Porta,Texto : String);
begin
inherited Create( false) ; { Rodar Imediatamente }

// FreeOnTerminate := true ;
fsPorta := Porta ;
fsTexto := Texto ;
end;


procedure ThreadEnviaLPT.Execute;
Var ArqPrn: TextFile;
begin
AssignFile( ArqPrn, fsPorta );

try
ReWrite( ArqPrn );
Write( ArqPrn, fsTexto ) ;
finally
System.CloseFile( ArqPrn ) ;
end ;

Terminate ;
end;


Uso:
#Código

Imprimir( ´LPT1´, #0, 100); { 100 milisegundos }


A ideia é: Se a Thread nao conseguir terminar antes do Timeout ocorrer, significa que a impressora nao conseguiu imprimir ( fora de linha )

Isso tb evita o congelamento do programa na linha: Write( ArqPrn, fsTexto ) ; ou writeln, quando a impressora nao está pronta...


Walbicudo
   - 23 out 2004

Pela arquitetura do NT (por isso NT4, 2000 e XP são mais robustos) que não permite chamadas diretas no hardware. Vc tem q usar a api do SO para fazer qualquer coisa.

Caro colega afarias teria como voce disponibilizar um exemplo de como checar a impressora pelo API do WINDOWSXP


Khundalini
   - 25 out 2004

O exemplo ilustrado pelo Dopi é show de bola. Resta saber se ele funciona pra checar se uma impressora de rede está pronta ou não. No mais, é melhor do que procurar funções da API do Windows pra checar isso. Muito inteligente essa solução.

[]s
Rubem Rocha
Manaus, AM