PDA

Ver la Versión Completa : Como particionar una banda en múltiples páginas ?


rolandoj
22-04-2011, 02:47:08
Hola a todos,

Me discilpan el título; pero fué la foma más aproximada que encontré para expresar la idea en pocas palabras. Explico ahora en detalle:

Tengo un sistema para el cual desarrollé múltiples informes en pantalla usando componentes TTreeView; con dibujo personalizado, que combina en cada línes del TTreeView texto con gráficas, usualmente de barras. Las gráficas superan con mucho el tamaño de la pantalla, así que lo que hacemos es fijar la parte de texto y usamos barras de desplazamiento para ver secciones de las gráficas. El sistema cuenta con diversas opciones para personalizar las gráficas y los textos; es decir, cada informe es muy complejo.

El problema es que nos han pedido imprimir esos informe, y la impresión debe ser horizontalmente continua; es decir, se debe imprimir la parte fija una sola vez y luego los gráficos en toda su extensión (o sea, no solo la parte visible en pantalla). Por simplicidad, imaginen que se trata de caracteres; que hay 400 líneas y 600 caracteres; pero, en cada hoja solo caben 50 líneas y 200 caracteres. Eso implica que la impresión tendría que ser así :

Página 1 : Líneas de la 1 a la 50, caracteres del 1 al 200
Página 2 : Líneas de la 1 a la 50, caracteres del 201 al 400
Página 3 : Líneas de la 1 a la 50, caracteres del 401 al 600
Página 4 : Líneas de la 51 a la 100, caracteres del 1 al 200
Página 5 : Líneas de la 51 a la 100, caracteres del 201 al 400
Página 6 : Líneas de la 51 a la 100, caracteres del 401 al 600
........
....
etcetera.

De esa forma, el usuario luego une las páginas de 3 en 3, con cinta pegante para que parezca como si cada bloque de 50 líneas se hubieran impreso en un papel extralargo. En otras palabras, lo mismo que hace Excel cuando debe imprimr demasiadas columnas para el ancho de la hoja de impresión.

Obviamente, una solución sería trabajar con TPrinter y repetir todo la lógica de programación ajustandose a la lona de TPrinter; pero, eso es inviable en términos de tiempo de desarrollo.

Lo que he pensado es desarrollar una rutina que genere una copia del Canvas de un TreeView; cambie las dimensiones de la copia para que simulen las dimensiones completas de cada franja de líneas, de forma que el dibujo sea continuo; aplicar a esta las rutinas del original; luego copiar secciones a un Bitmap e imprimir cada BitMap en una página.

En teoría debería funcionar; pero, hay varias cosas que me preocupan y es donde requiero la ayuda:

1. No estoy convencido de que sea el mejor método. Agradezco sugerencias.

2. Yo tengo Delphi 4. He leído informes de problemas copiando de Canvas a Canvas e imprimiendo bitmaps (por capacidades de impresoras y tipos de BitMaps). Alguién sabe de una documentación detallada al respecto ?

3. Tampoco tengo claros los detalles de la creación a tiempo de ejecución de la copia del TTreeView y el manejo de eventos de dibujo del mismo. Yo he creado a menudo controles a tiempo de ejecución y asignación dinámica de eventos; pero, no con dibujo personalizado. Aquí, a más de eso, hay que tener en cuenta que ese dibujo es por franjas y que hay que cambiar las dimensiones del mismo, a valores potencialmente muy altos. Alguién podría indicarme documentación al respecto ?

Agradezco cualquier ayuda, ya que la idea es empezar a programar esto la semana entrante.