PDA

Ver la Versión Completa : Imprimir en QReport


pablo
29-04-2004, 14:07:36
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

__cadetill
29-04-2004, 14:19:31
Qué sppedButton? Qué versión de Delphi? Qué versión de QR?? Es que nunca me ha pasado :D

Nuria
29-04-2004, 15:50:11
Hola Pablo!

Y qué mensaje de error te da?

Saludos... :)

marcoszorrilla
29-04-2004, 18:24:55
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.

__cadetill
29-04-2004, 18:31:44
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?? :confused:

PD: no obstante, recomiendo personalizar el Previsualizador del QR a uno propio, se puede controlar mucho mejor ;)

marcoszorrilla
29-04-2004, 18:54:37
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.

__cadetill
29-04-2004, 22:32:07
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 :D

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


procedure TPrevi.ImprimirExecute(Sender: TObject);
begin
Preview.QRPrinter.Print;
end;


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


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

jachguate
29-04-2004, 22:44:15
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:


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.

;)

__cadetill
30-04-2004, 00:25:46
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


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)


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


....
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? :confused:

Ala, un saludo

delphi.com.ar
30-04-2004, 01:11:42
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:

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!

jachguate
30-04-2004, 01:17:37
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 :rolleyes:

__cadetill
30-04-2004, 01:24:59
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 :D

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 :(

delphi.com.ar
30-04-2004, 01:28:11
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!

__cadetill
30-04-2004, 01:29:27
Esto...
... (lo acabo de probar)

sí :D :D

delphi.com.ar
30-04-2004, 01:32:17
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

__cadetill
30-04-2004, 01:32:41
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 :rolleyes:

delphi.com.ar
30-04-2004, 01:38:40
Uff.. me había asustado...
A ver si este ejemplo te sirve:
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é :D

delphi.com.ar
30-04-2004, 01:40:14
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!

__cadetill
30-04-2004, 02:02:32
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 ;)

SnaKe
30-04-2004, 08:35:53
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.


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í:


.......
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í:


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:


procedure TFPreview.FormClose(Sender: TObject; var Action: TCloseAction);
begin
QRPrinter.ClosePreview(Self);
Action := caFree;
end;


Espero vuestro comentarios...

Un saludo.

__cadetill
30-04-2004, 09:26:45
Efectivamente amigo Snake, lo he probado con mi Preview y también funciona correctamente mostrando el cuadro de diálogo de impresión.

Pero claro, con la solución anterior, de lo que se trataba esta precisamente de evitar mostrar dicho cuadro y hacer la impresión directa por la impresora predeterminada.

PD: empiezo a entender la solución de d.c.a, aunque aún no lo tengo demasiado claro.Seguiré dándole vueltas

capo979
15-04-2008, 14:35:16
Hola a todos!!!!

Quiero sacar el boton minimizar de los reportes qreport y si es posible también cambiar de idioma los botones que aparecen cuando se hace preview del reporte de qreport. He leido que hay un previsualizador realizado por cadetill pero la dirección que pasan no funciona. Alguien me puede ayudar con esto!!! o alguien me puede pasar un link para descargar ese previsualizador realizado por cadetill.

Muchas Gracias