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 29-04-2004
pablo pablo is offline
Miembro
 
Registrado: oct 2003
Ubicación: Argentina . Junin
Posts: 78
Poder: 21
pablo Va por buen camino
Imprimir en QReport

hola gente, mi consulta es si hay una manera de que no salte un error cuando uno hace doble click (por equivocacion) en el speedButon de la impresora en el Quick report...

saludos y gracias
pablo
__________________
Pablo Tello
Responder Con Cita
  #2  
Antiguo 29-04-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Qué sppedButton? Qué versión de Delphi? Qué versión de QR?? Es que nunca me ha pasado
Responder Con Cita
  #3  
Antiguo 29-04-2004
Avatar de Nuria
Nuria Nuria is offline
Miembro
 
Registrado: may 2003
Posts: 531
Poder: 22
Nuria Va por buen camino
Hola Pablo!

Y qué mensaje de error te da?

Saludos...
Responder Con Cita
  #4  
Antiguo 29-04-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Acabo de comprobar que si ocurre, haces una vista previa incluso con un programa finalizado haces doble clic en el icono impresora y te salta un error, la solución la tienes el la Web de Cadetill, es decir hazte un previsualizador personalizado.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #5  
Antiguo 29-04-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Cita:
Empezado por marcoszorrilla
Acabo de comprobar que si ocurre, haces una vista previa incluso con un programa finalizado haces doble clic en el icono impresora y te salta un error
Hacía mucho que no usaba el Preview del QR, pero es que me ha picado la curiosidad y he querido hacer la prueba.

Delphi 6 Ent. + QR 3.0.9 + W2k

y ninguna de las impresoras (la de configuración y la de impresión) me hace saltar ningún error

Cómo lo has logrado Marcos??

PD: no obstante, recomiendo personalizar el Previsualizador del QR a uno propio, se puede controlar mucho mejor
Responder Con Cita
  #6  
Antiguo 29-04-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Pues mira un programa para control de cursos que casualmente estoy utilizando ahora, por lo que no me puedo extender, hago vista previa doble clic sobre la impresora y me lanza el famoso "Access violation".

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #7  
Antiguo 29-04-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
pues sí, Marcos, es que yo sólo lo probaba con un simple clic, no con un doble clic.

El doble clic hace fallar tb a mi previsualizador

No se como lo hará el Preview del QR, pero en el mio hace lo siguiente

Código Delphi [-]
procedure TPrevi.ImprimirExecute(Sender: TObject);
begin
    Preview.QRPrinter.Print;
end;

Bueno, hacía, porqué lo que cambiado por esto

Código Delphi [-]
procedure TPrevi.ImprimirExecute(Sender: TObject);
  procedure HabilitaBotones(Estado: boolean);
  var
    i: integer;
  begin
    for i := 0 to ComponentCount - 1 do
      if Components[i] is TSpeedButton then
        TSpeedButton(Components[i]).Enabled := Estado;
    Application.ProcessMessages;
  end;
begin
  HabilitaBotones(false);
  try
    Preview.QRPrinter.Print;
  finally
    HabilitaBotones(true);
  end;
end;

El problema: Que el método Print no hace que el programa "se pare" en esa linea y vuelve a desbloquear los controles

Miraré a ver como se puede controlar el tema
Responder Con Cita
  #8  
Antiguo 29-04-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Seguramente print se ejecuta en otro hilo.

La printer no tiene alguna propiedad printing o algo similar??

con esto fácilmente se podria hacer algo como:

Código Delphi [-]
  if not Preview.qrPrinter.printing Then  // o lo que sea
    Preview.QRPrinter.Print;
  else
    ShowMessage('No se puede imprimir mientras se esta imprimiendo ');

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #9  
Antiguo 30-04-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Hola

He investigado por la linea que indicaba Juan Antonio pero claro, tan fácil no podía ser

Entonces he probado con la propiedad Status de TQRPrinter que, según una documentación antigua que he encontrado por internet (QR para D1) una impresión pasaba por estos estados

Código Delphi [-]
TQRPrinterStatus = (mpReady, mpBusy, mpFinished, mpPrinting, mpPreviewing);
Veo que en aquel entonces tenía el estado mpPrinting, y pienso, "de coña, un bucle mientras esté en este estado y listo!!!". Pues no, tampoco, lo señores de QuSoft tenían que quitar este estado. De hecho, almenos desde la versión que biene en Delphi 3, sólo quedan 3 de los 5 estados (encontré unos fuentes antiguos de la versión de D3)

Código Delphi [-]
TQRPrinterStatus = (mpReady, mpBusy, mpFinished);

Por lo que sólo veo una solución y es "apoderarme" del evento AfterPrint del Report y lanzar el mio propio para volver a habilitar los botones. Total que hago lo siguiente

Código Delphi [-]
....
    property AfterPrt: TQRAfterPrintEvent read FAfterPrt write FAfterPrt;
.....

procedure TPrevi.ImprimirExecute(Sender: TObject);
begin
  HabilitaBotones(false);
  if Assigned(Preview.QRPrinter.AfterPrint) then
    AfterPrt := Preview.QRPrinter.AfterPrint;
  Preview.QRPrinter.AfterPrint := AfterPrintReport;;

  Preview.QRPrinter.Print;
end;
Es decir, miro si estaba asignado el evento para lanzarlo despues del mio y al evento le asigno mi procedure. Pero, el problema es que no me captura mi procedure y sigue lanzando el suyo (el del componente TQuickReport)

No se por donde falla la lógica, pero debería de funcionar, no? O estoy muy espesito ya?

Ala, un saludo
Responder Con Cita
  #10  
Antiguo 30-04-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Muchas veces deshabilitando botones no funciona como "anti-rebote", pues si lo que hace dentro del botón es un proceso que no devuelve el control al sistema (Application.ProcessMessages), recien cuando termine este proceso se ejecutará el otro click por lo que tendras muchas impresiones (A la larga nunca sabrás si es lo que quizo el usuario)
Como prueba básica lo manejaría con una bandera:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
{$J+}
const
  bPrinting: Boolean = False;
begin
  if not bPrinting then
    try
      bPrinting := True;
      QuickReport.Print;
    finally
      Application.ProcessMessages; // Para que entren los mensajes pendientes
      bPrinting := False;
    end;
{$J-}
end;

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.

Última edición por delphi.com.ar fecha: 30-04-2004 a las 01:28:01.
Responder Con Cita
  #11  
Antiguo 30-04-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
es que al parecer print inicia la impresión en otro hilo... y devuelve inmediatamente el control al hilo principal. Si aún está imprimiendo y se invoca nuevamente a print, entonces la aplicación casca!!

Pa'variar... quick report
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #12  
Antiguo 30-04-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Efectivamente, como dice Juan Antonio, la opción propuesta falla porque el método Print devuelve el control del programa (lo acabo de probar)

Si se os ocurre alguna otra cosa.... será bienvenida, sino, será cuestión de cortarle las manos al usuario

Por cierto, otra cosa que he intentado (sin éxito) es redefinir el método Print, pero claro, éste no es virtual y me he quedado con las ganas
Responder Con Cita
  #13  
Antiguo 30-04-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Probaste lo que yo pase???...

PD: Le agregué el ProcessMessages, para que precisamente no haga lo que comente, igual aclaro que no tengo un Delphi para probarlo.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #14  
Antiguo 30-04-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Esto...
Cita:
Empezado por cadetill
... (lo acabo de probar)
Responder Con Cita
  #15  
Antiguo 30-04-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
A... eso era para mi!!
¿¿¿Quieren decir que Print es Asincrónico????
La verdad no lo creo!!

Si no es así tendría que funcionar, porque no se ejecutaría hasta que la bandera vuelva a su estado False
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #16  
Antiguo 30-04-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Esto... alvida mi mensaje anterior, que no había visto que has modificado el primero con el ProcessMessage

Por cierto, con él, funciona estupendamente, aunque no termino de enterder por qué? Si fueras tan amable de explicarmelo
Responder Con Cita
  #17  
Antiguo 30-04-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Uff.. me había asustado...
A ver si este ejemplo te sirve:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Add(DateTimeToStr(Now));
  Sleep(1000);
end;
Yo tengo el cuando el usuario hace varios clicks seguidos sobre ese botón, con la velocidad como para que sean interpretados como simples clicks, el hilo de ejecución ingresa en el método Button1Click y hasta que no sale de ahí no responderá a los mensajes del sistema operativo, como hizo mas de un click, los mensajes quedan encolados y se dispararán inmediatamente despues de que la aplicación responda a los mensajes de sistema operativo.

¿Fui claro?...o la compliqué
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #18  
Antiguo 30-04-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Me olvidé de un detalle (otra vez), lo que logro con ese ProcessMessages es que la aplicación dispache todos los mensajes en cola, antes que la bandera vualva a valer False!
(Prueba Poniendo un BreakPoint en la primer línea del método y verás lo que sucede)

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #19  
Antiguo 30-04-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Pues me parece que lo dejo para mañana, hoy estoy ya muy espeso y no lo veo claro

No obstante, decir que, para aquesllos que quieran, en mi web ya tenéis una nueva versión del Previsualizador con este error corregido (para D5, D6 y D7)

Ala, buenas noches
Responder Con Cita
  #20  
Antiguo 30-04-2004
Avatar de SnaKe
SnaKe SnaKe is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid (España)
Posts: 227
Poder: 22
SnaKe Va por buen camino
Hola,

A mi se me ocurre otra opción para mi gusto más elegante. ¿ Por que cuando se le da a imprimir desde un preliminar personalizado en el click del botón preliminar no imprimir directamente en la impresora sino sacar el cuadro de diálogo de configuración de impresoras (donde se puede elegir impresora y la configuración de la misma) ? Al aparecer un cuadro de diálogo modal se garantiza que el usuario no pueda hacer doble click en el botón y además se permite al usuario por ejemplo elegir otra impresora.

Se que me direis que eso requiere de dos clicks para imprimir pero bueno, a mi no me parece trastorno. En el preview personalizado que tengo es como lo hago y me funciona bien (y por ahora nadie se ha quejado).

Os pongo el código del click del botón imprimir de mi preview personalizado para que lo probeis a ver que opinais.

Código Delphi [-]
procedure TFPreview.tbImprimirClick(Sender: TObject);
begin
  if QRPrinter.Master <> nil then begin
    with TCustomQuickRep(QRPrinter.Master) do begin
      PrinterSetup;
      if Tag = 0 then
        Print;
    end;
  end;
end;

En mi formulario de Preview Personalizado añado algo así:

Código Delphi [-]
.......
  private
    { Private declarations }
    FQRPrinter : TQRPrinter;
  public
    { Public declarations }
    constructor CreatePreview(AOwner : TComponent; aQRPrinter : TQRPrinter);
    property QRPrinter : TQRPrinter read FQRPrinter write FQRPrinter;
  end;

Y el constructor es así:

Código Delphi [-]
constructor TFPreview.CreatePreview(AOwner : TComponent; aQRPrinter : TQRPrinter);
begin
  inherited Create(AOwner);
  QRPrinter := aQRPrinter;
  QRPreview.QRPrinter := aQRPrinter;
  if (QRPrinter <> nil) and (QRPrinter.Title <> '') then Caption := QRPrinter.Title;
end;

Y el close del formulario sería:

Código Delphi [-]
procedure TFPreview.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  QRPrinter.ClosePreview(Self);
  Action := caFree;
end;

Espero vuestro comentarios...

Un saludo.
__________________
Todos somos aficionados. La vida es tan corta que no da para más.
Guia de Estilos
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


La franja horaria es GMT +2. Ahora son las 11:30:06.


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