PDA

Ver la Versión Completa : Prevenir error en la impresion y redireccionar


lbidi
12-01-2011, 19:38:11
Estimado foro.

He leido algunos post sobre como evitar los errores de impresion, pero no he logrado buenos resultados.

Mi idea es "testear" de alguna manera el puerto lpt1, y si no esta conectado o la impresora no responde, avisarle al usuario y preguntarle si quiere grabar un archivo de texto con la impresion.

He utilizado el siguiente codigo


AssignFile( Printer, 'LPT1' );
FileMode := fmOpenReadWrite;
{$I-} Reset( Printer ); {$I+}
Rewrite( Printer );


pero se cuelga el programa en el rewrite si tengo la impresora apagada.

Cual seria la mejor manera para evitar este problema ??

Gracias a todos.

Saludos

duilioisola
12-01-2011, 20:06:55
Yo trataría con un bloque try..except


SePudoAbrir := True; {Inicializo esta variable booleana}
AssignFile( Printer, 'LPT1' );
FileMode := fmOpenReadWrite;
try
{Aqui trato de abrir la impresora}
Reset( Printer );
Rewrite( Printer );
except
{Si hay algun problema se va a meter en este bloque sino lo salta}
SePudoAbrir := False;
ShowMessage('La impresora no responde');
end;
{Si entro al bloque de excepcion SePudoAbrir sera False}
if (SePudoAbrir) then
begin
...
end;


Si quieres mostrar el error:

except
{Si hay algun problema se va a meter en este bloque sino lo salta}
on e:Exception do
begin
SePudoAbrir := False;
ShowMessage('La impresora no responde'+#13+e.Message);
end;
end;

lbidi
13-01-2011, 18:09:33
Amigo duilioisola.

He probado como me dijistes. He aqui mi codigo.


lPrinterok := True;
AssignFile( Printer, 'LPT1' );
FileMode := fmOpenReadWrite;
try
{$I-} Reset( Printer ); {$I+}
Rewrite( Printer );
except
on e:Exception do
begin
lPrinterok := False;
ShowMessage('La impresora no responde'+#13+e.Message);
end;
end;

if lPrinterok then
begin
Write( Printer, CHR(27) + CHR(64 ) ); <-- aqui se cuelga el programa
end


no tengo ninguna impresora enganchada al puerto lpt1, es mas,
mi pc no tiene puerto, pero sin embargo la variable lPrinterok me da true.

Se agradece cualquier comentario.

duilioisola
13-01-2011, 18:23:03
Pues trata de ver cual es el error que te da, metiendo el codigo que falla en un bloque try..except

if lPrinterok then
begin
try
Write( Printer, CHR(27) + CHR(64 ) ); <-- aqui se cuelga el programa
except
on e:exception do
ShowMessage('Error al enviar a la impresora '+#13+e.Message)
end;
end

Si nos cuentas cual es el mensaje de error, quizás podamos ayudarte un poco más.

Cuando dices "se cuelga el programa", podemos pensar diferentes cosas:
- El ordenador se apaga.
- El ordenador se reinicia
- El programa se apaga
- El programa no responde y hay que cerrarlo a "patadas"
- El programa da un mensaje de error.
- El programa formatea mi disco C y genera una subida de tensión que quema el router y el switch.

lbidi
02-02-2011, 14:45:49
Hola, recien he podido retomar este tema.

Sigo con el mismo problema, el programa se me cuelga, y lo debo cerrar forzosamente. He aqui el codigo.


AssignFile( Printer, 'LPT1' );
FileMode := fmOpenReadWrite;
try
{Aqui trato de abrir la impresora}
{$I-} Reset( Printer ); {$I+}
Rewrite( Printer );
Write( Printer, CHR(27) + CHR(64 ) ); <--- aqui se tranca
except
{Si hay algun problema se va a meter en este bloque sino lo salta}
on e:Exception do
begin
ShowMessage('La impresora no responde'+#13+e.Message);
end;
end;


Cualquier ayuda sera bienvenida.

Muchas gracias.

Saludos.

Leo

duilioisola
02-02-2011, 14:53:26
Repito:
Si nos cuentas cual es el mensaje de error, quizás podamos ayudarte un poco más.

Ya nos has dicho donde falla. Es en la linea write(Printer, ...);
Ok, pero ¿Cuál es el mensaje de error?
Se supone que en el centro de la pantalla debería salir una ventana que dice

-------------------------------------------------
La impresora no responde
Un texto, en inglés seguramente, que describe el problema.
-------------------------------------------------

lbidi
02-02-2011, 15:03:36
Es que no me sale ningun error..

Solamente se congela la aplicacion y debo cerrarla con la cruz, a lo cual me confirma que la aplicacion no responde.

Gracias..

Casimiro Notevi
02-02-2011, 15:12:13
Puede que tengas que esperar el "timeout" de la impresora para que finalmente salga el error, déjala un ratito a ver.

duilioisola
02-02-2011, 15:33:46
Quita las directivas de compilacion {$I(+-)}
{$I-} Reset( Printer ); {$I+}
Esto hace que no salte ninguna exception, a pesar de que puede haber algún error.
Si utilizas estas directivas de compilación deberías ver el resultado de IOResult, para ver si todo ha ido bien.

AssignFile( Printer, 'LPT1' );
FileMode := fmOpenReadWrite;
try
{Aqui trato de abrir la impresora}
Reset( Printer );
Rewrite( Printer );
Write( Printer, CHR(27) + CHR(64 ) ); <--- aqui se tranca
except
{Si hay algun problema se va a meter en este bloque sino lo salta}
on e:Exception do
begin
ShowMessage('La impresora no responde'+#13+e.Message);
end;
end;


De todos modos no se porqué haces un Reset y luego un Rewrite.
Deberías hacer solo uno de ellos y creo que es Rewrite.

duilioisola
02-02-2011, 15:47:48
Otra cosa: Agrega : (dos puntos) después del puerto al que quieres imprimir. De lo contrario entenderá que es un archivo sin extensión.
Y si puedes no utilices Printer como variable, pues puede estar confundiéndose con la Unit Printer. Yo la llamaría Puerto.
AssignFile( Puerto, 'LPT1:' );



var
Puerto : TextFile;
[...]
AssignFile( Puerto, 'LPT1:' );
FileMode := fmOpenReadWrite;
try
{Aqui trato de abrir la impresora}
Rewrite( Puerto);
Write( Puerto, CHR(27) + CHR(64 ) ); <--- aqui se tranca
except
{Si hay algun problema se va a meter en este bloque sino lo salta}
on e:Exception do
begin
ShowMessage('La impresora no responde'+#13+e.Message);
end;
end;
CloseFile( Puerto );

lbidi
02-02-2011, 16:37:42
Estimados.. he hecho los cambios sugeridos y dado tiempo al sistema para comprobar si me tiraba el error.

Efectivamente luego de un buen tiempo, me ha largado el siguiente error.

"Error E/S 1167".

No entiendo porque el sistema no lo capta antes cuando se hace el try.

Gracias a ambos.

duilioisola
02-02-2011, 16:43:27
Según esta página de Microsoft (http://msdn.microsoft.com/en-us/library/ms681383%28v=vs.85%29.aspx) la impresora no está conectada.

ERROR_DEVICE_NOT_CONNECTED - The device is not connected.
1167 (0x48F)

duilioisola
02-02-2011, 16:52:55
No entiendo porque el sistema no lo capta antes cuando se hace el try.
Los procesos como estos tienen un tiempo de TimeOut.
Es un tiempo durante el cual Windows le envía una petición al dispositivo y espera a que este le responda.

lbidi
03-02-2011, 12:39:04
Gracias duilio por toda tu ayuda.

Saludos.