Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Prevenir error en la impresion y redireccionar (https://www.clubdelphi.com/foros/showthread.php?t=71821)

lbidi 12-01-2011 19:38:11

Prevenir error en la impresion y redireccionar
 
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

Código Delphi [-]
    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

Código Delphi [-]
    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:
Código Delphi [-]
    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.

Código Delphi [-]
    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

Código Delphi [-]
    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.

Código Delphi [-]
    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:
Cita:

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.
Código Delphi [-]
    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:' );

Código Delphi [-]

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 la impresora no está conectada.

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

duilioisola 02-02-2011 16:52:55

Cita:

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.


La franja horaria es GMT +2. Ahora son las 03:46:39.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi