FoxPress – Diciembre 2003

 

Gráficos con VFP 8.0 y el control gratuito TC1FreeImage

http://www.fpress.com/

 

 

 

En Junio de 2001 FoxPress publicó un artículo titulado: ‘enviar E-mails gráficos ‘on the fly’ con VFP.

 

Este artículo creaba un gráfico y lo enviaba por E-mail. La herramienta para crear los gráficos se llamaba T1CfreeImage de la empresa www.tonec.com

 

Esa herramienta es totalmente gratuita pero tiene una serie de limitaciones como son que sólo te crea gráficos en formato *.PNG. En el momento que se publicó ese artículo, Fox 7 no era capaz de soportar ese formato de gráficos y por eso la única solución era comprar el producto equivalente de la misma casa que soportaba también *.PNG

 

Pero FoxPro 8 ha incorporado la opción de soportar ficheros *.PNG con lo que se te abre la posibilidad de usar el producto gratuito de esa casa en tus desarrollos. Como a más de uno este formato no le suene de nada, voy a trascribir un texto que se publicaba en ese número sobre este formato.

 

El formato de imagenes PNG (Portable Network Graphic) nace debido a los problemas de patente del algoritmo de compresión LZW (Lempel-Ziv-Welch) que emplean las imagenes de tipo GIF, utilizadas desde 1987. Aunque el formato JPG cubre bastantes de las necesidades en cuanto a compresión de imágenes, con tasas muy superiores a los GIF, es inadecuado para generar imagenes transparentes, animadas e incluso fotografias que contengan textos, diagramas o iconos. Las imágenes de tipo PNG poseen todas las caracteristicas del formato GIF, con un algoritmo de compresión más eficaz, sin perdida de información y con posibilidad de emplear un numero de colores superior a los 256 que impone el formato GIF. El formato PNG mantiene la capacidad de carga en modo entrelazado, es decir con una primera versión de la imagen de 1/8 de calidad, que se carga en 1/8 del tiempo total, una segunda en 1/4, tercera en 1/2 y por fin la versión final. Con ello puede decidirse detener la carga de la imagen, viendo su aspecto inicial. El formato PNG, debido a su reciente aparición sólo es soportado por los navegadores más recientes. Se recomienda emplear MS Explorer 4.0 o superior.

 

Para verlo en funcionamiento deberemos hacer lo siguiente:

 

1.- Bajarnos de la web el control

 

2.- Registrarlo con REGSRV32.EXE

 

3.- Create un programa parecido a este:

 

im = CreateObject("T1CFreeImage.Images.1")

im.CreateImage(100,100)

im.SetColor (255,0,0)

im.DrawLine (10,10,30,30)

im.SetColor (0,0,255)

im.DrawText (10,40,"Hola Boy")

im.SaveToFile ("c:\test.png")

im = NULL

 

Y ahora vete a mirar en C:\ un fichero llamado test.png. Verás que te ha creado un fichero gráfico inmodificable (salvo que tengas un programa de retoque) y que se visualiza perfectamente con el IE. Del mismo modo que escribes la palabra Hola Boy podrías poner cualquier tipo de información de tu Base de Datos, con líneas, etc... O sea hacer un informe completo pero cuyo resultado en vez de imprimirlo en papel es dejarlo en formato de foto.

      

      Lo que veriamos si lo abrimos desde el explorer sería algo parecido a:

 

 

          Un gráfico más elaborado lo podríamos construir con este código:

 

im = CreateObject("T1CFreeImage.Images.1")

 

lnTamaño = 300 && Tamaño cuadrada de la imagen

lxValorMaximo = 300

lyValorMaximo = 300

 

im.CreateImage(lnTamaño,lnTamaño)

im.SetColor (0,0,0)

im.DrawLine (20,0,20,lnTamaño - 12) && Vertical

im.DrawLine (20,lnTamaño - 12,lnTamaño - 12,lnTamaño - 12) && Horizontal

im.DrawText (10,lnTamaño - 11,"0")

im.DrawText (lnTamaño-20 ,lnTamaño-11, lxValorMaximo)

im.DrawText (0,0, lyValorMaximo)

 

im.SetColor (255,0,0) && Rojo

 

im.DrawLine (20,280,40,50)

im.DrawLine (40,50,80,90)

im.DrawLine (80,90,180,90)

im.DrawLine (180,90,200,190)

im.DrawLine (200,190,230,250)

 

im.SetColor (0,0,255)

 

*im.DrawText (10,40,"Hola Boy")

 

im.SaveToFile ("c:\test.png")

im = NULL

 

Pero si quisieramos leer de una tabla tendríamos que hacer esto y establecer una proporción:

 

im = CreateObject("T1CFreeImage.Images.1")

 

lnTamaño = 300 && Tamaño cuadrado de la imagen

lnBordeizq = 20

lnbordefondo = 11

 

CREATE CURSOR datos(campox N(3), campoy N (3))

INSERT INTO DATOS VALUES (20,100)

INSERT INTO DATOS VALUES (40,50)

INSERT INTO DATOS VALUES (60,10)

INSERT INTO DATOS VALUES (80,200)

INSERT INTO DATOS VALUES (100,30)

 

SELECT MAX(campox) FROM datos INTO ARRAY arrayx

SELECT MAX(campoy) FROM datos INTO ARRAY arrayy

 

lxValorMaximo = arrayx

lyValorMaximo = arrayy

 

lxProporcion = (lnTamaño-lnBordeizq)/(lxValorMaximo+lnBordeizq)

lyProporcion = (lnTamaño-lnbordefondo)/lyValorMaximo

 

im.CreateImage(lnTamaño,lnTamaño)

 

im.SetColor (0,0,0)

 

im.DrawLine (lnBordeizq,0,lnBordeizq,lnTamaño - 12) && Vertical

im.DrawLine (lnBordeizq,lnTamaño - 12,lnTamaño - 12,lnTamaño - 12) && Horizontal

 

im.DrawText (11,lnTamaño - lnbordefondo,"0")

im.DrawText (lnTamaño-lnBordeizq ,lnTamaño-lnbordefondo, lxValorMaximo)

im.DrawText (0,0, lyValorMaximo)

 

im.SetColor (255,0,0) && Rojo

 

im.DrawLine (lnBordeizq,lnTamaño-lnbordefondo ,(lnBordeizq + 20)* lxProporcion ,lnTamaño -(100 * lyProporcion))

im.DrawLine ((lnBordeizq + 20) * lxProporcion ,lnTamaño -(100 * lyProporcion),(lnBordeizq + 40)* lxProporcion,lnTamaño -(50 * lyProporcion))

im.DrawLine ((lnBordeizq + 40)* lxProporcion,lnTamaño -(50 * lyProporcion) ,(lnBordeizq + 60)* lxProporcion,lnTamaño -(10 * lyProporcion))

im.DrawLine ((lnBordeizq + 60)* lxProporcion,lnTamaño -(10 * lyProporcion),(lnBordeizq + 80)* lxProporcion,lnTamaño -(200 * lyProporcion))

im.DrawLine ((lnBordeizq + 80)* lxProporcion,lnTamaño -(200 * lyProporcion),(lnBordeizq + 100)* lxProporcion,lnTamaño -(30 * lyProporcion))

 

 

im.SetColor (0,0,255)

 

*im.DrawText (10,40,"Hola Boy")

 

im.SaveToFile ("c:\test.png")

im = NULL

 


 


En este caso estamos leyendo de una tabla y estamos poniendo los datos de forma proporcional al máximo y mínimo obtenido de ordenadas y abcisas y en proporción al tamaño del marco con sus bordes ajustados.

 

 

FoxPress – Disiembre de 2003

© 2003 FoxPress. All rights reserved