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 23-11-2005
Avatar de Jesús Pena
Jesús Pena Jesús Pena is offline
Miembro
 
Registrado: nov 2005
Posts: 88
Poder: 19
Jesús Pena Va por buen camino
Question Pregunta sobre QRCreateList

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).
Responder Con Cita
  #2  
Antiguo 23-11-2005
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
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


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

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

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

Código Delphi [-]
{$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
Responder Con Cita
  #3  
Antiguo 23-11-2005
Avatar de Jesús Pena
Jesús Pena Jesús Pena is offline
Miembro
 
Registrado: nov 2005
Posts: 88
Poder: 19
Jesús Pena Va por buen camino
Bien pero ......

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.

Última edición por Jesús Pena fecha: 23-11-2005 a las 12:36:52.
Responder Con Cita
  #4  
Antiguo 23-11-2005
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
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.

Código Delphi [-]
   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 que proporciona el foro por ejemplo la etiqueta [delphi].

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

Un saludo
Responder Con Cita
  #5  
Antiguo 23-11-2005
Avatar de Jesús Pena
Jesús Pena Jesús Pena is offline
Miembro
 
Registrado: nov 2005
Posts: 88
Poder: 19
Jesús Pena Va por buen camino
He hecho como me dices pero ...

al hacer el qrxxxxxx.preview dá un access violation y no sé cual puede ser la solución.

Gracias por tu atención.
Responder Con Cita
  #6  
Antiguo 24-11-2005
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
Hola Jesús

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

Saludos
Archivos Adjuntos
Tipo de Archivo: zip reporte.zip (3,2 KB, 44 visitas)
Responder Con Cita
  #7  
Antiguo 25-11-2005
Avatar de Jesús Pena
Jesús Pena Jesús Pena is offline
Miembro
 
Registrado: nov 2005
Posts: 88
Poder: 19
Jesús Pena Va por buen camino
Unhappy He visto el proyecto que me enviaste y todo muy bien pero ....

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
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?.
Responder Con Cita
  #8  
Antiguo 25-11-2005
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
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
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 07:42:37.


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