Introducción a Rave Reports - Parte I: reportes basados en código

By: Ricardo Sosa

Abstract: Esto es una introducción a Rave Reports. La parte I describe cómo trabajar con reportes basados en código

Resumen: esto es una introducción a Rave Reports. La parte I describe cómo trabajar con reportes basados en código. – por Leonel Togniolli

Delphi 7 incluye Rave Reports como la solución para reportes por defecto, reemplazando Quick Reports. Puesto que trabajan de manera muy diferente, mucha gente se confunde con el nuevo entorno. Se entiende esto como una introducción para gente que nunca ha trabajado con Rave aún, y le gustaría comenzar.

Delphi 7 contiene Rave Reports 5.0.8. Si todavía no lo tiene, descargue la actualización desde la página de usuarios registrados, puesto que corrige algunos problemas importantes.

Se pueden desarrollar reportes con Rave usando dos diferentes métodos: Basados en código o con el Diseñador. Este documento describe cómo trabajar con el motor basado en código. La parte II describirá el Diseñador visual.

    Reportes basados en código

Con Basado en código, usted escribe reportes usando código fuente de Delphi. Esto provee una manera muy flexible de mostrar cualquier tipo de dato, permitiendo cualquier tipo de disposiciones complejas.

Para escribir un reporte basado en código, solo coloque un componente TRvSystem en el formulario y escriba el reporte en el evento OnPrint. Sender es el reporte que está creando, y puede ser encapsulado en TBaseReport. Este contiene todos los métodos que usted necesita para mostrar información de ese reporte en particular.

    Reporte simple basado en código

Aquí tenemos un reporte simple usando el mecanismo basado en código:

procedure TPrincipal.RvSystemPrint(Sender: TObject);

begin

with Sender as TBaseReport do

begin

SetFont('Arial', 15);

GotoXY(1,1);

Print('Bienvenido a los reportes basados en código en Rave')

end

end;

Para ejecutar este reporte, llame el método RvSystem.Execute.

Entonces, ¿qué hace este simple código? Primero, llama a SetFont para seleccionar la fuente y el tamaño del texto que será impreso desde ese punto. Después coloca el cursor en las coordenadas (1,1). Estas coordenadas están expresadas usando las unidades que aparecen en la propiedad SystemPrinter.Units del objeto RvSystem, que por defecto son pulgadas. Usted puede cambiarla a unUser y colocar un número relativo pulgadas en la propiedad SystemPrinter.UnitsFactor. Por ejemplo, si UnitsFactor está colocada en 0,5 entonces 1 unidad correspondería a media pulgada. Finalmente, el código llama el método Print para mostrar el texto. Aquí está la salida:

Hide image
rave code1

    Reporte basado en código tabulado

Aquí tenemos otro ejemplo. Este muestra una lista de las carpetas en la raíz del disco actual, junto con una cuenta recursiva del número de archivos y carpetas, y el tamaño total de los archivos incluidos en cada carpeta.

procedure TPrincipal.PrintTabularReport(Report: TBaseReport);

var

FolderList: TStringList;

i: Integer;

NumFiles, NumFolders, SizeFiles: Cardinal;

Root: string;

begin

with Report do

begin

SetFont('Arial', 15);

NewLine;

PrintCenter('Lista de carpetas en el disco raíz', 4);

NewLine;

NewLine;

ClearTabs;

SetTab(0.2, pjLeft, 1.7, 0, 0, 0);

SetTab(1.7, pjRight, 3.1, 0, 0, 0);

SetTab(3.1, pjRight, 3.5, 0, 0, 0);

SetTab(3.5, pjRight, 4.5, 0, 0, 0);

SetFont('Arial', 10);

Bold := True;

PrintTab('Nombre de carpeta');

PrintTab('Cantidad de archivos');

PrintTab('Cantidad de carpetas');

PrintTab('Tamaño de archivos');

Bold:= False;

NewLine;

FolderList:= TStringList.Create;

try

Root:= IncludeTrailingPathDelimiter(ExtractFileDrive(ParamStr(0)));

EnumFolders(FolderList, Root);

for i:= 0 to FolderList.Count - 1 do

begin

PrintTab(FolderList[i]);

GetFolderInfo(IncludeTrailingPathDelimiter(Root+FolderList[i]), NumFiles, NumFolders, SizeFiles);

PrintTab(Format('%u',[NumFiles]));

PrintTab(Format('%u',[NumFolders]));

PrintTab(Format('%u bytes',[SizeFiles]));

NewLine;

end

finally

FolderList.Free

end

end

end;

Note que se ha tomado un camino diferente: en lugar de especificar las coordenadas de cada texto de salida, la impresión fue hecha usando Líneas y Columnas como referencia. La altura de la línea depende del tamaño de la fuente utilizada: cada unidad representa de pulgada, así que cada línea impresa con un tamaño de fuente 10 tendrá, aproximadamente, una altura de 0,138 pulgadas. Las líneas avanzan luego de llamar PrintLn o NewLine. Las columnas se definen usando llamadas al método SetTabs, y el método PrintTab imprimirá el texto en la columna actual y avanzará a la siguiente. Aquí está la salida:

Hide image
Click to see full-sized imagePuede encontrar el código fuente completo, incluyendo la implementación de EnumFolders y GetFolderInfo, en CodeCentral.

    Reporte gráfico basado en código

Se pueden incluir formas e imágenes en sus reportes basados en código, junto con el texto. El siguiente ejemplo lo demuestra:

procedure TPrincipal.PrintGraphicsReport(Report: TBaseReport);

var

Bitmap : TBitmap;

begin

with Report do

begin

Canvas.Brush.Color:= clGray;

Rectangle(0.3, 0.3, 4.7, 3.3);

SetFont('Arial', 15);

FontColor:= clRed;

PrintXY(0.5,0.5, '¡Mira todos los gráficos!');

Bitmap:= TBitmap.Create;

try

Bitmap.LoadFromFile('delphi.bmp');

PrintBitmap(3.5,0.3,1,1, Bitmap);

PrintBitmap(1,2,3,3, Bitmap);

Canvas.Pen.Color:= clBlue;

Canvas.Brush.Bitmap := Bitmap;

Ellipse(5,0.3,6,3.3);

Ellipse(2,1,4,1.9);

finally

Bitmap.Free;

end;

Canvas.Pen.Color:= clBlack;

Canvas.Brush.Style:= bsSolid;

Canvas.Brush.Color:= clYellow;

Pie(0.7,0.7,1.7,1.7,1,1,1,2);

Canvas.Brush.Color:= clGreen;

Pie(0.7,0.7,1.7,1.7,1,2,1,1);

end;

end;

En este ejemplo los métodos Rectangle, Ellipse y Pie han sido usados para dibujar formas con diferentes rellenos. Los Bitmaps fueron mostrados usando PrintBitmap y como el pincel de las elipses. Aquí está la salida:

Hide image
rave code3Una aplicación de ejemplo, conteniendo todo el código fuente para estos tres ejemplos puede encontrarse en CodeCentral.

    Conclusión

Como puede ver, hacer los reportes basados en código ofrece una gran flexibilidad y control de la disposición que desea, pero requiere algo de trabajo para implementarlo. En la parte II veremos cómo el Diseñador visual puede usarse para hacer reportes potentes de una manera muy fácil.

Server Response from: ETNASC04