Página principal
Artículos y trucos
Catálogo de productos
Ejemplos y descargas
Mis libros
Cursos de formación
Investigación y desarrollo
Libros recomendados
Mis páginas favoritas
Acerca del autor
 
En colaboración con Amazon
 
Intuitive Sight

Vistas preliminares a la medida

Ya he perdido la cuenta de las veces que me han preguntado cómo se programa una ventana de vista preliminar para QuickReport. No voy a mostrar las últimas técnicas disponibles, que pasan por definir una clase de ventana de vista preliminar por omisión (falta de documentación, como siempre), pero la técnica que mostraré vale para todas las versiones de QuickReport.

Primero desarrollaremos la ventana de vista preliminar. Creamos un nuevo formulario, al cual llamaremos wndPrev. En su interior dejamos caer un ToolBar y un componente QRPreview, de la página QReport de la Paleta de Componentes. A este último control le cambiamos su propiedad Align a alClient. Ahora interceptamos el método OnClose del formulario, para garantizar la devolución de recursos:

procedure TwndPrev.FormClose(
   Sender: TObject; var Action: TCloseAction);
begin
   Action := caFree;
   QRPreview1.QRPrinter := nil;
end;

En la barra de herramientas añadimos cuatro botones para navegar por las páginas. Estos son los métodos que ejecutarán:

procedure TwndPrev.bnPrimero(Sender: TObject);
begin
   QRPreview1.PageNumber := 1;
end;

procedure TwndPrev.bnAnterior(Sender: TObject);
begin
   QRPreview1.PageNumber := QRPreview1.PageNumber - 1;
end;

procedure TwndPrev.bnSiguiente(Sender: TObject);
begin
   QRPreview1.PageNumber := QRPreview1.PageNumber + 1;
end;

procedure TwndPrev.bnUltimo(Sender: TObject);
begin
   QRPreview1.PageNumber := QRPreview1.QRPrinter.PageCount;
end;

Traemos dos botones más, para el factor de escala de la muestra:

procedure TwndPrev.bnZoomIn(Sender: TObject);
begin
   QRPreview1.Zoom := QRPreview1.Zoom + 20;
end;

procedure TwndPrev.bnZoomOut(Sender: TObject);
begin
   QRPreview1.Zoom := QRPreview1.Zoom - 20;
end;

Existen también métodos para los valores especiales de acercamiento: ZoomToFit y ZoomToWidth. Para terminar con la ventana, traemos un botón de impresión:

procedure TwndPrev.bnPrint(Sender: TObject);
begin
   QRPreview1.QRPrinter.Print;
end;

En el informe para el cual queremos esta vista preliminar debemos interceptar el evento OnPreview:

procedure TrptCustomer.QuickRep1Preview(Sender: TObject);
begin
   with TwndPrev.Create(nil) do
   begin
      QRPreview1.QRPrinter := Sender as TQRPrinter;
      ShowModal;
      // El formulario se destruye automáticamente
   end,
end;

Para tener acceso al tipo TQRPrinter necesitamos añadir la unidad QRPrntr a la cláusula uses de la unidad del informe. Estoy mostrando la vista preliminar en forma modal, pero también podía haber utilizado una ventana no modal o incluso MDI.

Finalmente, hay que tener cuidado con la forma en que se ejecuta el informe:

procedure TwndMain.Button1Click(Sender: TObject);
begin
   rptCustomer.QuickRep1.PreviewModal;
end;

En La Cara Oculta de Delphi 4, el ejemplo de vista preliminar del CD-ROM llamaba directamente al método Preview. Pero a partir de la versión 3.0.3 de QuickReport, que apareció mucho después de salir Delphi 4 al mercado, este método dejó de funcionar con formularios de previsualización a la medida.