Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Impresión
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-01-2011
Avatar de lbidi
lbidi lbidi is offline
Miembro
 
Registrado: oct 2003
Ubicación: Montevideo- URUGUAY
Posts: 417
Poder: 21
lbidi Va por buen camino
Thumbs down 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
Responder Con Cita
  #2  
Antiguo 12-01-2011
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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;
Responder Con Cita
  #3  
Antiguo 13-01-2011
Avatar de lbidi
lbidi lbidi is offline
Miembro
 
Registrado: oct 2003
Ubicación: Montevideo- URUGUAY
Posts: 417
Poder: 21
lbidi Va por buen camino
Exclamation

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.
Responder Con Cita
  #4  
Antiguo 13-01-2011
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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.
Responder Con Cita
  #5  
Antiguo 02-02-2011
Avatar de lbidi
lbidi lbidi is offline
Miembro
 
Registrado: oct 2003
Ubicación: Montevideo- URUGUAY
Posts: 417
Poder: 21
lbidi Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 02-02-2011
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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.
-------------------------------------------------
Responder Con Cita
  #7  
Antiguo 02-02-2011
Avatar de lbidi
lbidi lbidi is offline
Miembro
 
Registrado: oct 2003
Ubicación: Montevideo- URUGUAY
Posts: 417
Poder: 21
lbidi Va por buen camino
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..
Responder Con Cita
  #8  
Antiguo 02-02-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Puede que tengas que esperar el "timeout" de la impresora para que finalmente salga el error, déjala un ratito a ver.
Responder Con Cita
  #9  
Antiguo 02-02-2011
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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.
Responder Con Cita
  #10  
Antiguo 02-02-2011
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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 );
Responder Con Cita
  #11  
Antiguo 02-02-2011
Avatar de lbidi
lbidi lbidi is offline
Miembro
 
Registrado: oct 2003
Ubicación: Montevideo- URUGUAY
Posts: 417
Poder: 21
lbidi Va por buen camino
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.
Responder Con Cita
  #12  
Antiguo 02-02-2011
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Según esta página de Microsoft la impresora no está conectada.

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

Última edición por duilioisola fecha: 02-02-2011 a las 16:50:42.
Responder Con Cita
  #13  
Antiguo 02-02-2011
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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.
Responder Con Cita
  #14  
Antiguo 03-02-2011
Avatar de lbidi
lbidi lbidi is offline
Miembro
 
Registrado: oct 2003
Ubicación: Montevideo- URUGUAY
Posts: 417
Poder: 21
lbidi Va por buen camino
Gracias duilio por toda tu ayuda.

Saludos.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
redireccionar web angelp4492 Internet 3 22-01-2008 01:57:45
Código de verificación para prevenir envíos automáticos elcigarra PHP 2 04-05-2007 01:01:19
Cómo prevenir que se cierre??? Pandre Varios 5 11-02-2004 09:02:26
Prevenir la salida de la aplicación negama Varios 3 31-05-2003 03:05:02


La franja horaria es GMT +2. Ahora son las 23:18:45.


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
Copyright 1996-2007 Club Delphi