Gráficos con VFP 8.0 y el control
gratuito TC1FreeImage
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