Conceptos Básicos sobre Impresión en Windows
La principal diferencia entre el manejo de una impresora en MsDos y Windows es el hecho de que, en Windows, la impresora se gestiona en modo gráfico, esto supone que se van a manejar diferentes tamaños de letra, trazar algunos dibujos y, posiblemente, previsualizar todo en pantalla.
Lo más importante es, que las diferentes impresoras pueden tener diferentes resoluciones. Y todo esto tiene que controlarse. FiveWin automatiza estos procesos ofreciéndole máxima potencia con la mínima complejidad. FiveWin clasifica los trabajos de impresiones en estos tipos diferentes.
- Técnicas de impresión rápida
- Manejo del objeto Printer
- El motor de informes
Además del motor de informes de FiveWin, FiveWin le ofrece técnicas RAD (rapid aplication development) para crear rápidamente y sin esfuerzo prototipo de sus impresiones:
- Generación de un informe completo del área de trabajo actual: Llame a la función Report () para obtener, de forma automática, un informe completo y paginado del área de trabajo actual.
- Generación automática de un informe desde cualquier browse: Si ejecuta :Report() siendo una referencia a su browse, fiveWin generará un informe completo con el mismo contenido de su browse. Por tanto, la forma más fácil de implementar un informe de su browse, se basa en situar un botón bitmap en su cuadro de diálogo con la acción :Report().
- Impresión de una copia de una ventana o control: Si desea obtener una impresión de un cuadro de diálogo, basta con ejecutar: :HardCopy() donde es un objeto cuadro de diálogo y es un factor de escala.
Se recomienda a usar el valor 3 para mantener las dimensiones naturales. Puede usar un bitmap en lugar de un cuadro de diálogo o cualquier ventana o control.
Combinando estas técnicas, puede crear un prototipo rápido de sus primeras impresiones. No las olvide.
Utilice estas técnicas en las primeras etapas de su aplicación.
FiveWin maneja la impresora como un objeto, por lo controlar el proceso de impresión es tan fácil como manipular, desde el punto de vista de la orientación a objetos, el objeto pinter (impresora)
¿Cómo se crea un objeto printer?
El motor de impresión se basa en la clase Tprinter para manejar la impresora como un objeto, así como mandatos xBase específicos para facilitar su manipulación:
PRINT oPrn NAME “Mi Impresión” PREVIEW
PAGE
. . .
oPrn:say( nRow, nCol, cText, . . . )
. . .
ENDPAGE
ENDPRINT
El mandato PRINT crea un objeto TPRINT. Desde ese momento, puede manipularlo directamente, usando los datos y métodos ofrecidos por la clase Tprinter.
Habitualmente, las páginas se crean usando varios mandatos del tipo:
PAGE
…
ENDPAGE
Dentro de cada sección, se envían mensaje al objeto printer. El mensaje más habitual: Say():oPrn:Say(nLinea,nColumna,cTexto,oFont)
Recuerde que las coordenadas de impresión dependen de la resolución de la impresora, que esté usando. Para controlar esto debe interrogar al objeto printer sobre su resolución específica.
oPrn:VertRes() es el número de pixel en Vertical.
oPrn:HorzRes() es el número de Pixel Horizontal.
Debe dividir esos valores entre el número de filas y columnas que desea manejar, e incrementar nRow,nCol de acuerdo a estos pasos.
Para crear un objeto letra que adapte su tamaño a la resolución específica de una impresora, se utiliza la cláusula contenedora OF:
Ejemplo:
PROCEDURE MAIN ()
Local oPrn, oFont,nRow:=1,nCol:=1
PRINT oPrn
DEFINE FONT oFont NAME “ARIAL” SIZE 0,-10 OF oPrn
PAGE
oPrn:Say(nRow,nCol,oDp:cEmpresa,oFont)
ENDPAGE
ENDPRINT
oFont:End()
RETURN NIL
Recuerde destruir la fuente <oFont:End()> una vez que finalice la impresión.
Puede generar una previsualización del trabajo de impresión indicando la cláusula PREVIEW al crear un objeto printer.
Ejemplo:
PRINT oPrn NAME “Visualizar” PREVIEW
DEFINE FONT oFont NAME “ARIAL” SIZE 0,-10 OF oPrn
PAGE
oPrn:Say(nRow,nCol,oDp:cEmpresa,oFont)
ENDPAGE
ENDPRINT
oFont:End()
RETURN NIL
Realiza la impresión en video, dando al usuario la posibilidad de previsualizar y de seleccionar o no la impresión del trabajo.
El motor de reportes utiliza archivos METAFILE de Windows para guardar cada página a imprimir. La dirección de estos ficheros se obtiene desde el valor “TEMP” del entorno de Windows. SET TEMP C:\WINDOWS\TEMP
El motor de objetos almacenar los archivos temporales WMF (Windows Metafile) en esta carpeta y los borrará una vez finalice la previsualización.
Todas las instrucciones se escriben en forma de mandato.
PRINT ;
NAME ;
FROM USER;
PREVIEW;
TO
PAGE
oPrint:Say(nRow,nCol,cText,oFont,nWidth,nClrText)
ENDPAGE
ENDPRINT
Significado de los Parámetros y comandos.
PRINT: Genera el Objeto de Impresión.
oPrint: Referencia del objeto Impresora.
cName: Nombre del documento a Generar; es el nombre que aparece en la cola de impresión y como título de la ventana de previsualización.
PAGE: Inicia una página nueva.
oPrint:Say(), Método que permite imprimir texto en las coordenadas específicas medida en unidades de resolución de la impresora. Es recomendable trabajar en centímetros o pulgadas utilizando métodos similares: oPrint:CmSay() o oPrint:InchSay() en los que las coordenadas estan en centímetros o pulgadas. Además, obtiene la misma presentación con diferentes impresoras.
Valor a imprimir, puede se cualquier tipo y el método lo convierte en una expresión de Cadena.
Objeto oFont a usar sobre el valor
Ancho o espacio a utilizar medido en unidades específicas de la impresora. Si este parámetro no es enviado, el método lo calcula automáticamente.
Color opcional a utilizar para , puede utilizar colores indicándolos en Definicion, Decimal o RGB(), para mayo información consulte referencia de colores.
Ejemplo: oPrint:CmSay(1,1,”Azul”,oFont,nil,CLR_BLUE)
ENDPAGE: Finaliza la actual página Impresa.
ENDPRINT: Finaliza la Impresión.
PREVIEW: Ejecuta el sistema de previsualización que ofrece al usuario una vista preliminar de la impresión antes de enviarla a la impresora.
La clase Treport creada por “Ignacio Ortiz”, es un motor de reportes de muy fácil definición y es altamente productiva.
Si observamos la clase TPRINT para construir reportes, es necesario tomar una calculadora y medir el tamaño de cada columna, distribuirlas eficientemente, crear un complejo de programa que administre totales, rupturas de control salto de páginas, lectura de datos, filtrado de registros, asignación de fuentes, entro otros. Para simplificar esta compleja labor la clase TREPORT proporciona un conjunto de métodos, valores y otras clases de objetos que se encargan de todo esto, solo necesita por parte del programador la declaración de actividades en forma de mandatos.
Todos los Reportes tiene la siguiente construcción:
REPORT oReport …
COLUMN …
COLUMN …
END REPORT
GROUP ON …
GROUP ON …
ACTIVATE REPORT oReport …
Como puede ver, la construcción básica es muy simple. A continuación, se indica la sintaxis completa con todas sus opciones:
REPQRT [];
[TITLE <bTitle,…> []];
[HEADER <bHead, …> []];
[FOOTER <bFoot,…> []];
[FONT <oFont, … > ];
[PEN <oPen, … > ];
[< lSum:SUMMARY >] ;
[< file: FILE IFILENAME IDISK > ];
[< resource: NAME │RESNAME │ RESOURCE > ] ;
[< toprint: TO PRINTER >];
[< toScreen: PREVIEW >] ;
[TO FILE ];
[TO DEVICE ];
[CAPTION ]
GROUP [];
[ON ];
[HEADER ];
[FOOTER ];
[FONT ];
[< lEject:EJECT >]
COLUMN [];
[TITLE <bTitle, … > ];
[AT ] ;
[DATA <bData, …> ] ;
[SIZE ] ;
[PICTURE <cPicture, … > ]
[FONT ] ;
[< total: TOTAL >[ FOR ] ] ;
[< ColFmt: LEFT │ CENTER │CENTERED │ RIGHT >] ;
[< LShadow:SHADOW >] ;
[< lGrid:GRID >[ ] ]
ENDREPORT
ACTIVATE REPORT ;
[FOR ] ;
[WHILE ] ;
[ON INIT ] ;
[ON END ] ;
[ON STARTPAGE ] ;
[ON ENDPAGE ] ;
[ON STARTGROUP ] ;
[ON ENDGROUP ] ;
[ON STARTLINE ]
[ON ENDLINE ] ;
[ON CHANGE ]
Con el mandato COLUMN (vea la sintaxis) se indican todas las columnas que el informe tendrá, incluyendo los datos a mostrar y el titulo de cada columna. No puede ser más simple. Por ejemplo:
COLUMN TITLE “Nombre” DATA oCursor:Nombre
Si desea totalizar una columna, añada la cláusula TOTAL al mandato.
Por ejemplo:
COLUMN TITLE “Sueldo” DATA oCursor:Salario TOTAL
Puede añadir cabeceras y pies al informe declarándolos en el mandato REPORT.
Por ejemplo:
REPORT oReport TITLE “Mi primer informe”.
HEADER “Esta es la cabecera”.
FOOTER “Este es el pie”.
Puede incluso especificar su posición (a la izquierda, derecha o centrado) añadiendo LEFT, RIGHT o CENTER │CENTERED.
Por ejemplo:
REPORT oReport TITLE “Mi primer informe”.
HEADER “Esta es la cabecera” RIGHT.
FOOTER “Este es el pie” CENTER.
Recuerde: Por defecto los títulos se centran, y las cabeceras y pies aparecen a la izquierda.
Si desea que un título ocupe más de una línea, separe cada parte del título mediante una coma.
Por ejemplo:
REPORT oReport;
TITLE “Mi primer informe”, “con Datapro”
Lo mismo se aplica a cabeceras y pies.
El motor de informes NUNCA añade una línea en blanco entre la cabecera y el título, o entre el título y los títulos de columna. Es su responsabilidad añadir líneas en blanco donde lo desee. Por ejemplo, si desea añadir una línea en blanco entre la cabecera y el título, simplemente indique una segunda línea en la cabecera con nada en ella (una cadena vacía):
REPORT oReport TITLE “Mi informe”.
HEADER “Mi cabecera”, ” “
Puede añadir prácticamente lo que quiera en sus informes ya que se permite el uso de cualquier expresión que devuelva una cadena de caracteres. Esta es la clave para mostrar cualquier cosa.
Por ejemplo, si desea añadir la fecha al informe y el número de página actual, haga lo siguiente:
REPORT oReport TITLE “Mi informe”
“Fecha: “+DtoC (Date ());
FOOTER “Número página: “+;
Str (oReport: nPage,3)
Puede indicar expresiones en lugar de cadenas de caracteres en cualquier parte: títulos, cabeceas, – pies, títulos de columna, datos de columnas, etc…
Por defecto, el informe se envía a la impresora, pero puede cambiar el destino al crear el informe:
REPORT oReport….;
TO PRINTER=> (Por defecto)
REPORT oReport;
PREVIEW (A la pantalla)
REPORT oReport….;
TO FILE (Formato texto)
Cuando envía el informe a pantalla (PREVIEW), el motor de informes crea todas las páginas hasta que pulsa el botón Preview. A continuación, se muestra inmediatamente la primera página creada.
Al crear un informe puede especificar un nombre. Este nombre será el título de la ventana de previsualización, si envía el informe a la pantalla, o la descripción mostrada en el spooler, si lo envía a la impresora. (En versiones anteriores, se usaba la palabra “NAME”.)
Puede usar cualquier tipo de letra en sus informes. Para ello:
Defínalas primero con el mandato DEFINE FONT oFont ….
DEFINE FONT oFontl NAME “ARIAL” SIZE 0,-10
DEFINE FONT oFont2 NAME “ARIAL” SIZE 0,-10 BOLD
Las especificaciones de tamaño (anchura, altura) emplean unidades de medida diferentes en función de si se imprime o se muestra en pantalla. En pantalla, las unidades son píxeles, pero al imprimir las unidades son “puntos” del tipo de letra. Por tanto, para texto impreso sólo se usa la segunda especificación de tamaño (altura) para dar el tamaño del punto, dejando la “anchura” a “O”. El tamaño en puntos se expresa como un número negativo; por ejemplo “10 puntos” es “-10”.
Recuerde que el tamaño en puntos para una letra proporcional es diferente que el “paso”, término utilizado con frecuencia para tipos de letra no proporcionales como Courier. El tamaño en puntos refiere a la altura de la letra, mientras que el paso expresa el número de letras imprimidas por pulgada. El tipo de letra “pica” normal tiene un paso de 10, es decir 10 letras por pulgada. Pero, presada en tamaño, tiene 12 puntos. Por contra, el tipo de letra “elite”, más pequeño, tiene un paso de 12 (12 letras por pulgada) y 9 puntos. (Resulta algo confuso, ya que cuando mayor es el paso, menor es la fuente, todo lo contrario que cuando se habla del tamaño en puntos.)
Además, recuerde que, en el motor de informes, FiveWin determina que está trabajando con tamaños en puntos en lugar de píxels si se usan números negativos (y debe usar puntos en lugar del paso para tipos de letra no proporcionales como Courier). En este caso, el signo “-“ no significa (como las reglas matemáticas sugieren) que el tamaño del punto es menor cuanto mayor es el valor entero, sino todo lo contrario. Cuanto mayor es el entero, mayor es el tamaño.
Cuando cree el informe, especifique los tipos de letra que va a utilizar, separándolos con comas.
Por ejemplo:
REPORT oReport TITLE…. ;
FONT oFontl, oFont2, oFont3
El primer tipo de letra de la lista (oFont1) será el estándar. Se utilizará siempre que no especifique o tipo de letra para una columna.
Si desea utilizar el segundo tipo de letra en otra columna, haga lo siguiente:
COLUMN “CODIGO”;
DATA oCursor:CODIGO;
FONT 2
Como puede ver, se indica el número ordinal que ocupa el tipo de letra en la lista definida al crear informe.
COLUMN “Sueldo”;
DATA oCursor:SALARIO;
FONT IIF (oCursor:SALARIO>l00000,2,1)
Recuerde que debe liberar los tipos de letra al finalizar el informe.
Aquí tiene la sintaxis completa:
Definir un tipo de letra:
DEFINE FONT ;
[ NAME ];
[ SIZE , ] ;
[ FROM USER ];
[ BOLD ] ;
[ ITALIC ] ;
[ UNDERLINE ] ;
[ WEIGHT ] ;
[ OF ] ;
[ NESCAPEMENT ] ;
ACTIVATE FONT
DEACTIVATE FONT
RELEASE FONT
SET FONT [ OF ] [TO ]
FROM USER Muestra el cuadro de diálogo de Tipos de letra
BOLD Crea un tipo de letra con el atributo negrita.
ITALIC Crea un tipo de letra con el atributo cursiva.
UNDERLINE Crea un tipo de letra con el atributo subrayado.
Puede ser definido a través de las fuentes de letra, ejemplo:
DEFINE FONT oFont NAME “Arial” SIZE 0, -10 NESCAPEMENT -900
Si el valor nEscapement es positivo, la fuente será girada en sentido inverso al movimiento de las manecillas de un reloj, si el valor es negativo la fuente será girada en sentido a las manecillas del reloj. Con el valor 900 queda vertical. Luego se Asigna la fuente al reporte.
Al crear las columnas, puede especificar su configuración:
- PICTURE: Idéntico a los GETS. Formato de la Expresión
- SIZE: Longitud de la columna (número de caracteres)
- AT: Imprime en una posición específica (mejor no usarlo)
- FONT: Tipo de letra a utilizar (número en la lista de fuentes)
- TOTAL: Si la columna debe tener un total.
Si especifica que la columna tiene un total, DATA debe ser numérico. Si no lo es, no se preocupe; el motor de informes no se detendrá. La cláusula TOTAL puede incluir una condición FOR. Por ejemplo:
COLUMN;
TITLE “Salario”;
DATA oCursor:SALARIO
TOTAL FOR oCursor:COD_DPTO=”Ventas”
- LEFT│CENTER│CENTERED│RIGHT: También puede especificar la forma en que el texto se imprime (a la izquierda, derecha o centrado). Por defecto, todo se alinea a la izquierda excepto los datos numéricos, que se alinean a la derecha.
Esto es algo que le encantará. Suponga que necesita añadir otra columna, pero la anchura del papel no es suficiente.
Podría usar un tipo de letra menor, pero no es una buena solución. La mejor forma es usar varias líneas en una misma columna. Esto significa que un registro de la base de datos puede usar más de una línea en el informe, y que es posible hacer cosas como esta
Trabajador Salario
oCursor:APELLIDO oCursor:Salario
oCursor:NOMBRE
Es tan simple como:
COLUMN TITLE “Trabajador”;
DATA oCursor:APELLIDO,oCursor:NOMBRE
COLUMN TITLE “Salario”;
DATA oCursor:SALARIO
Basta con separar mediante una coma los datos a imprimir.
Puede hacer lo mismo con el título de la columna:
COLUMN;
TITLE “Nombre”, “Apellido”
DATA oCursor:NOMBRE, oCursor:APELLIDO
Si usa la cláusula TOTAL en esa columna, se sumarán los valores numéricos. Aunque todos los datos usarán la misma PICTURE, este comportamiento se puede cambiar, como luego se verá.
Creando en un grupo se pueden obtener subtotales sobre un dato en particular. Con la utilidad Report Form de Clipper puede crear dos grupos. Con otros generadores, puede crear hasta nueve, pero con el motor de informes no hay límite.
Si desea que los totales de los grupos se impriman, debe al menos totalizar una columna.
Los datos deben ordenarse de acuerdo con la expresión del grupo.
Para crear un grupo, siga los siguientes pasos:
REPORT oReport
TITLE “Grupos”
COLUMN TITLE “Código”;
DATA oCursor:CODIGO
COLUMN TITLE “Apellido”;
DATA oCursor:APELLIDO
GROUP ON oCursor:COD_CARGO;
EJECT
END REPORT
El informe totalizará las columnas creadas con la cláusula TOTAL para cada Cargo. Asimismo, se expulsará la página al cambiar de Cargo. Recuerde solicitar la consulta SQL con la cláusula “ORDER BY COD_CARGO”
Puede incluso especificar una cabecera, pie y tipo de letra específicas para ese grupo (sólo se admite una línea en la cabecera y el pie):
GROUP ON oCursor:COD_CARGO;
FOOTER “Total Cargo:”;
FONT 2;
EJECT
Recuerde que puede crear tantos grupos como desee.
Si especifica la cláusula SUMMARY al crear el informe:
REPORT oReport TITLE … SUMMARY
Sólo se imprimirá la información sobre grupos. La cláusula SUMMARY sólo debe usarse cuando, al menos, haya un grupo definido.
Al utilizar la cláusula SUMMARY, el motor de informes no añade ninguna línea de separación de grupos.
Al activar el informe, es posible definir condiciones FOR y WHILE.
Por ejemplo:
ACTIVATE REPORT oReport;
WHILE oCursor:COD_CARGO= “Ventas”;
FOR oCursor:SALARIO > 100000
Puesto que el motor de informes puede crear un informe incluso a partir de un array, la condición WHILE es, por defecto, “!oCursor:Eof()”. Si utiliza la condición WHILE y genera un informe de una base de datos, es aconsejable incluir en la condición WHILE el texto seguido de “.and. !oCursor:Eof()”:
ACTIVATE REPORT oReport;
WHILE oCursor:COD_DPTO= “Compras” .AND. !oCursor:Eof();
FOR oCursor:SALARIO > 100000
Puede controlar el flujo del informe de la misma forma que controla otras ventanas.
Al activar el informe, puede indicar qué funciones serán llamadas cuando el informe se encuentre en un estado particular:
ACTIVATE REPORT oReport ;
ON INIT … ;
ON END …. ;
ON STARTPAGE ….;
ON ENDPAGE … ;
ON STARTGROUP …. ;
ON ENDGROUP …. ;
ON STARTLINE … ;
ON ENDLINE …. ;
ON CHANGE …
La función INIT se llama una sola vez, al inicio de la primera página una vez que los títulos de columna han sido impresos.
La función END se llama una sola vez, en la última página y tras imprimir los totales generales.
La función STARTPAGE se llama al inicio de cada página. Es de las más usadas, puesto que con ella se pueden añadir bitmaps, líneas, cajas, etc…
La función ENDPAGE se llama al final de cada página, cuando todo el texto se ha impreso (no es muy útil).
La función STARTGROUP se llama al inicio de cada grupo y antes de imprimir la cabecera de grupo (si se definió).
La función ENDGROUP se llama al final de un grupo.
La función STARTLINE se llama al inicio de cada línea del cuerpo del informe. Cuando STARTLINE se evalúa, el motor controla si la siguiente línea cabe en la página actual. Si no es así, se expulsa la página y se inicia una nueva. Tenga cuidado al usar STARTLINE, ya que si existen columnas multilínea se producen al menos dos STARTLINE por cada registro procesado.
La función ENDLINE se llama al final de cada línea del cuerpo del informe. Cuando se evalúa ENDLINE, toda la línea se ha impreso, y el número de línea actual del informe se incrementa.
La función CHANGE se llama en cada “oCursor:DbSkip()” si está listando un cursor de datos. Por razones prácticas, esta función se llama antes del oCursor:DbSkip() y no después. Es una cláusula que se usa con frecuencia.
En el código fuente, se ha incluido una línea en blanco en StartGroup y la emisión de un bip al finalizar el informe.
Es posible acceder a cualquier parte del informe si conoce cómo funciona el objeto Report y de qué forma ha sido diseñado.
El objeto Report tiene muchos datos y métodos que debe conocer y utilizar.
Como mínimo, incluye un objeto Column, un objeto Line (para el título), y un objeto Device. Si existen grupos, también tiene un objeto Group.
Los objetos TRColumn, TRLine y TRGroup son la base del motor de informes.
TRColumn contiene todas las columnas del informe, incluyendo su título, los datos, los totales, etc.. (objeto vertical)
TRLine contiene todas las líneas, que aparecen en el informe de izquierda a derecha. Puede considerarlas como objetos horizontales. Aquí se incluyen los títulos, cabeceras y pies.
TRGroup contiene toda la información sobre cada grupo definido en el informe.
Puede manipular el comportamiento de cualquier objeto cambiando sus datos o utilizando algunos de sus métodos.
Examine los datos y métodos de las clases. Quedará impresionado de todo lo que puede hacer. El único límite es su imaginación.
Ejemplos:
Cambiar el tipo de letra del título de la columna 3 para usar el segundo tipo. Dado que la columna es multilínea, cambiar el picture de la segunda línea a “999,999”:
LOCAL oColumn
oColumn := oReport:aColumns[3]
oColumn:bTitleFont := {││ 2} // Es un codeblock
oColumn:aPicture [2] : = “999,999”
Justificar a la izquierda la primera línea del título y usar el tipo de letra a la derecha la segunda línea y usar el tipo de letra 3:
#define LINE_LEFT 1
#define LINE_RIGHT 2
LOCAL oLine
oLine := oReport:oTitle
oLine:aPad[l]:= LINE_LEFT// justificar línea 1
oLine:aPad[2]:= LINE_RIGHT // justificar línea 2
oLine:aFont[l]:= {││2} // tipo de letra línea 1
oLine:aFont[2]:= {││3} // tipo de letra línea 2
Como puede ver, el objeto TRLine contiene múltiples líneas, por lo que la mayoría de datos son arrays.
En el pie de cada grupo, imprimir el valor actual y el número de registros incluidos en el grupo:
GROUP ON oCursor:COD_DPTO ;
FOOTER “Total Departamento”+;
oReport:aGroups[l] :cValue+ ;
str(oReport:aGroups[l] :nCounter)
Basta con ejecutar oCursor:GoBottom(), cambiar la forma en que el informe efectúa los saltos, y modificar la condición While:
oCursor:=Opentable(“SELECT * FROM NMDPTO”,.T.)
oCursor:GoBottom()
REPORT oReport ….
COLUMN …
END REPORT
oReport:bSkip := {││oCursor:DbSkip(-l)}
ACTIVATE oReport WHILE !oCursor:Bof()
Use una variable estática para mantener el elemento actual del array y cambie los codeblocks Skip y While.
STATIC nField
Function Main ( )
nField := 1
REPORT oReport ….
COLUMN …
COLUMN …
END REPORT
oReport:bSkip := {││nField++}
ACTIVATE REPORT oReport ;
WHILE nField <= len(aStructure)
Puede usar dos cláusulas adicionales al crear sus columnas:
- Shadow: Imprime en gris claro el fondo de la columna.
- Grid: Añade dos líneas verticales a ambos lados de la columna.
Por ejemplo:
COLUMN TITLE … SHADOW GRID
Puede modificar el tipo, anchura y color de la rejilla. Para ello, debe crear las plumas necesarias:
COLUMN TITLE … GRID
Por defecto, la pluma usada es negra, sólida y con un grosor 1.
La creación de plumas es idéntica a la de tipos de letra. (Consulte la Guía Norton para más información sobre plumas.)
Por ejemplo:
DEFINE PEN oPen WIDTH 5
REPORT oReport PEN oPen
COLUMN TITLE …. GRID 1
END REPORT
ACTIVATE REPORT
Ciertos datos de los objetos de un informe le permiten cambiar el aspecto del mismo.
Por ejemplo:
- nTotalLine: Es el aspecto para las líneas de total. Por defecto es RPT_DOUBLELINE (2)
- nGroupLine: Es el aspecto para las líneas de grupo. Por defecto es RPT_SINGLELINE (1)
- nTitleUpLine: Es el aspecto para las líneas de los títulos de columna. Por defecto es RPT_DOUBLELINE (2)
- nTitleDnLine: Es el aspecto para las líneas inferiores de los títulos de columna. Por defecto es RPT_DOUBLELINE (2)
- cPageTotal: Es una descripción para el total de página. Por defecto es ””
- cGrandTotal: Es una descripción para el total general. Por defecto es “”
y también algunos métodos como:
- Margin(nValue, nType, nScale): Este método le permite cambiar los márgenes superior, inferior, izquierdo y derecho del informe, en pulgadas o centímetros.
- Say(nCol, xText, nFont, nPad, nRow): Este método le permite escribir el texto que desee en el informe, indicando la columna (donde el objeto columna empieza), el texto, el número de tipo de letra a usar, el número de alineación (izquierda, derecha, centro) y la fila (la actual por defecto ).
Añadir un bitmap a su informe es muy simple. Mediante STARTPAGE, llame a una función propia que dibuje el bitmap empleando el método SayBitmap de TReport.
Por ejemplo:
ACTIVATE REPORT oReport ;
ON STARTPAGE Mybitmap()
Function Mybitmap()
oReport:SayBitmap(.3, .3,”BITMAPS\LOGO.BMP”, .5, .5)
RETURN NIL
Estos son los parámetros del método Saybitmap:
- nRow
- nCol
- cBitmap (fichero)
- nWidth
- nHeight
- nScale
Si nScale es INCHES (1), entonces 1, 2, 4 Y 5 están en pulgadas; si nScale es CMETERS (2), 1,2, 4 Y 5 están en centímetros.
Añadir un cuadro o línea al informe es sencillo. Mediante STARTPAGE, llame a una función propia que dibuje una línea o cuadro empleando los métodos Line o Box de TReport.
Por ejemplo:
ACTIVATE REPORT oReport ;
ON STARTPAGE Mybox()
Function Mybox ()
oReport:Box(.l, .1, 11.1, 7.6)
RETURN NIL
Estos son los parámetros del método BOX:
- nRow
- nCol
- nBottom
- nRight
- nPen
- nScale
Estos son los parámetros del método LINE:
- nTop
- nLef
- nBottom
- nRight
- nPen
- nScale
Imprimir campos memo resulta difícil en muchos generadores de informes, pero es bastante sencillo con el motor de informes de FiveWin.
Vea cómo se hace:
- Cree una columna con la cláusula DATA vacía, pero indique el tamaño (anchura de línea en caracteres) que desea para el campo memo:
COLUMN TITLE “Comentarios” DATA” ” SIZE 50
- Cree una función que será llamada por la cláusula ON CHANGE, como ésta:
Function SayMemo()
LOCAL nLines, nFor
nLines := Mlcount(oCursor:Coment,50)
/*
Puesto que ON CHANGE hace que la línea se incremente, debemos decrementar la línea actual en uno.
*/
oReport:BackLine(l)
/*
Ahora podemos empezar a imprimir. Recuerde que antes de imprimir algo, debe llamar a StartLine, y que después debe llamar a EndLine. De esta forma, el programa controla los saltos de página.
*/
FOR nFor := 1 to nLines
oReport:StartLine()
oReport:Say(nMemoColumn , ;
MemoLine(oCursor:Coment,50,nFor))
Report:EndLine()
NEXT
RETURN NIL
También es posible convertir el memo en arreglos e imprimirlo:
Local aLines
aLines:=_VECTOR(oCursor:cMemo,CHR(10))
FOR nFor := 1 to LEN(aLines)
oReport:StartLine()
oReport:Say(nMemoColumn,aLines[nFor])
Report:EndLine()
NEXT
Y esto es todo lo que debe hacer.
Puede cambiar el color de cada tipo de letra usando el método SetTxtColor.
SetTxtColor() recibe dos parámetros. El primero indica el nColor a usar (consulte Colors.ch), y el segundo, el número de tipo de letra en el informe.
Por ejemplo:
oReport:SetTxtColor(CLR_HRED,l)
También puede controlar el color de cualquier pluma indicando sus colores al crearla. Por ejemplo:
DEFINE PEN oPen COLOR CLR BLUE
Si desea cambiar el color de la pluma horizontal usada en títulos y totales, use el método SetPenColor.
Por ejemplo:
oReport:SetPenColor(CLR_RED)
También puede cambiar el color de las sombras mediante el método SetShdColor(nNewColor), que, por defecto, es LIGHTGRAY.
En Rept23.PRG se utiliza la técnica de impresión de memos para imprimir un fichero de texto. Resulta muy útil para convertir rápidamente informes de Clipper para DOS a Windows.
Por ejemplo, si su aplicación DOS crea informes mediante R&R Code Generator o Bandit, use la opción de informes DOS para enviar los informes a un archivo .TXT. Luego, adapte el código de este ejemplo para que FiveWin imprima los archivos .TXT con los informes. Asegúrese de que el tipo de letra especificado en el código se corresponde con el usado para la creación del informe. Imagine lo que ello supone: puede convertir sus actuales informes DOS a Windows en menos de 20 minutos, sin importar su complejidad.
Por supuesto, si existe código para solicitar o responder a las diferentes opciones del informe en los .prg de DOS, deberá convertido a FiveWin.
Nota: Al previsualizar este informe, puede aparecer borroso debido al uso del tipo de letra de paso fijo. Al imprimirse, no aparecerá borroso.