PDA

Ver la Versión Completa : Pregunta sobre QRCreateList


Jesús Pena
23-11-2005, 00:22:28
He diseñado una opción que me permite realizar el listado de la información de todas las tablas de mi base de datos seleccionando los campos y los criterios de ordenacion, por otro lado tengo un formulario de preview personalizado y quisiera hacer que la previsualización del listado "genérico" salga por el mio personalizado en lugar del standard del QuickReport para poder utilizar las funcionalidades implementadas en él (Básicamente la exportación de datos).

Héctor Randolph
23-11-2005, 06:39:25
Hola Jesús.

Bueno, me ha confundido bastante tu mensaje, de hecho no entiendo tu pregunta, lo que es más no veo ninguna pregunta.

Así que ahora pregunto yo, ¿Lo que realmente quieres es utilizar un formulario personalizado para mostrar la vista previa de un reporte?

Porque, según el título tu pregunta es referente a QRCreateList :confused:


Bueno responderé a la cuestión del formulario personalizado:

Tienes que crear una interfaz para mostrar el formulario, esto lo consigues derivando de la clase TQRPreviewInterface y creando los métodos Show y ShowModal

Paso 1:

TQRCustomPreviewInterface = class(TQRPreviewInterface)
public
function Show(AQRPrinter : TQRPrinter) : TWinControl; override;
function ShowModal(AQRPrinter : TQRPrinter): TWinControl; override;
end;


no olvides incluir a QRPrntr en uses.

Después implementas los métodos Show y ShowModal
Paso 2


function TQRCustomPreviewInterface.Show(AQRPrinter: TQRPrinter): TWinControl;
var
frm : TCustPreview;
begin
frm := TCustPreview.Create(Application, AQRPrinter);
frm.Show;
Result := frm;
end;

function TQRCustomPreviewInterface.ShowModal(AQRPrinter: TQRPrinter): TWinControl;
var
frm : TCustPreview;
begin
frm := TCustPreview.Create(Application, AQRPrinter);
frm.ShowModal;
Result := frm;
end;


En el código anterior donde aparece TCustPreview coloca el nombre de tu formulario personalizado.

Esto lo puedes guardar un una unit por separado.

Después tienes que registrar la interface con la función RegisterPreviewClass que se encuentra en la unidad QRPrntr no olvides incluirla en uses.

Paso 3:


RegisterPreviewClass(TQRCustomPreviewInterface);


Este código lo pones al iniciar tu aplicación, con esto lográs que cada vez que invoques al método Preview o PreviewModal se hace una llamada a tu formulario.

Una cosa más, debes redefinir el constructor de tu formulario personalizado para que responda correctamente, esto lo lográs con el siguiente código.


{$WARNINGS OFF}
TCustPreview = class(TForm)
QRPreview1: TQRPreview;
procedure CustPreviewClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
fQRPrinter : TQRPrinter;
public
{ Public declarations }
constructor Create(AOwner : TComponent; AQRPrinter : TQRPrinter); virtual;
end;
{$WARNINGS ON}


constructor TCustPreview.Create(AOwner: TComponent;AQRPrinter: TQRPrinter);
begin
inherited Create(AOwner);
fQRPrinter := AQRPrinter;
QRPreview1.QRPrinter := AQRPrinter;
end;

procedure TCustPreview.CustPreviewClose(Sender: TObject;var Action: TCloseAction);
begin
fQRPrinter.ClosePreview(Self);
Action := caFree;
end;



Espero que sea útil, un saludo

Jesús Pena
23-11-2005, 12:12:29
La solución está "bien" de hecho el objetivo que queria conseguir está logrado y funcionando, lo que ocurre es que ahora los listados que tenia ya desarrollados no se ven. He de decirte que cada vez que el usuario solicita un listado este se muestra en modo preview y tiene la opcion desde el preview de imprimir este por la impresora.

Si sabes a que se puede deber esta anomalía te agradecería tu ayuda.

El código que tengo implementado en el report base (tengo uno base y los demás heredan de ese) es

procedure TqrBase.QuickRepPreview(Sender: TObject);
begin
with TfrmQRPreview.Create(Sender as TQRPrinter) do
begin
frmQRPreview.QRPreview1.QRPrinter := Sender as TQRPrinter;
frmQRPreview.ShowModal;
// El formulario se destruye automáticamente
end;
end;


y al compilar me da error en la linea with TfrmQRPreview.Create(Sender as TQRPrinter) do dándome el siguiente mensaje [Error] qBase.pas(62): E2010 Incompatible types: 'TComponent' and 'TQRPrinter'

Saludos.

Héctor Randolph
23-11-2005, 20:37:07
Hola amigo Jesús

Con el código que publiqué anteriormente no necesitas crear el formulario cada vez que quieras mostrar una vista previa, para eso es la interfaz para remplazar la vista previa estándar de QReport por una personalizada.

Lo único que tienes que hacer es invocar al método Preview de cualquier reporte y automáticamente se mostrará tu formulario.


QuickRep.Preview; // esto es todo lo que hay que hacer


Por cierto, para que se entienda mejor el código que publicas utiliza las etiquetas (http://www.clubdelphi.com/foros/showthread.php?t=10005) que proporciona el foro por ejemplo la etiqueta [delphi].

[ delphi]
//coloca aquí tu código
[ /delphi]

Un saludo

Jesús Pena
23-11-2005, 23:56:38
al hacer el qrxxxxxx.preview dá un access violation y no sé cual puede ser la solución.

Gracias por tu atención.

Héctor Randolph
24-11-2005, 00:26:47
Hola Jesús

Revisa el código que te envío adjunto, lo he probado y funciona sin problemas.

Saludos

Jesús Pena
25-11-2005, 01:17:05
He revisado el proyecto que me has enviado y lo veo bien y todo correcto pero mi aplicación sigue sin funcionar por lo cual te pido que me guies de cómo puedo hacerlo bien.

Te cuento, mi aplicación tiene un menu desde el que se lanzan los distintos módulos que forman parte de la aplicación, existen módulos de captura de datos (heredados de un formulario base que contiene todas las cosas comunes a los formularios) y desde los mismos se pueden lanzar Reports (heredados también de un report base), tengo tambien en dicho menu la posibilidad de lanzar esos listados, así como un generador "genérico" de informes en los que en función de la tabla seleccionada, los campos de los mismos y un criterio de ordenación establecidos por el usuario se realiza un listado con qrcreatelist (este último lo visualiza bien con el preview personalizado).
En el report base tengo en el evento QuickRepPreview tengo el siguiente código procedure TqrBase.QuickRepPreview(Sender: TObject);
begin
qrBase.Preview;
end;

pero al hacerlo me dá un access violation.

Si no te importa, me gustaria que me indicaras en donde tengo que colocar cada una de las cosas que me indicaste en el mensaje del 23/11/2005 06:39 para que funcione, me estoy volviendo loco y una cosa que me parece de gran utilidad tendré que prescindir de ella pues estoy perdiendo un tiempo muy valioso (EL TUYO TAMBIEN LO ES).

Gracias y perdón por tantas molestias.

P.D. : Por cierto sé que necesito el parche para la rtl90.bpl (para la gestión de memoria) pero además de en borland no sé donde conseguirlo ¿sabrás tú donde?.

Héctor Randolph
25-11-2005, 04:45:53
Sólo una pregunta, ¿Porqué en un evento OnPreview, lanzas otra vez el preview?

Es decir, al parecer estás anidando incorrectamente los eventos, si dentro del evento OnPreview del reporte base haces otra llamada a Preview estas generando recursividad.

Prueba a lanzar la vista previa del reporte base fuera del evento, por ejemplo en un evento Onclick de un botón.


Saludos