13 de agosto de 2007

Incrustar imágenes

Artículo original: Embed Your Images
http://weblogs.foxite.com/bernardbout/2007/02/17/embed-your-images/
Autor: Bernard Bout
Traducido por: Ana María Bisbé York

Siempre ha sido un problema para mi tener que incluir imágenes para cada clase en un archivo externo. No sólo es lento el acceso; es que VFP tiene una forma irritante de mostrar el cursor en forma de Reloj de sol, cada vez que accede desde el disco. Esto es especialmente notable en botones gráficos que tiene un cambio de bitmap para eventos MouseEnter y MouseLeave.

Ya no más. Utilizando un campo en la clase - el campo USER, tengo eliminados, en una sola línea, estos dos irritantes problemas . Utilizando el método descrito aquí, se eliminan las lecturas de disco y no hay necesidad de incluir bitmaps.
Nota: Este método trabaja solamente con VFP9 una vez que la propiedad PictureVal se emplea para cargar imágenes. Esto también trabaja solamente con la clase base IMAGE, porque otros objetos, aunque tienen propiedad Picture, no tienen propiedad PictureVal.
Este método es sencillo. Guarda un bitmap en el campo USER de la clase image y en tiempo de ejecución lo recupera y asigna a PictureVal de la imagen este valor.

Comencemos. Cree una clase nueva - ImageXML basada en un objeto image. Por ahora, solamente guárdela.



He creado un Generador sencillo para ayudar en la inserción de imágenes. Esto está incluido en los archivos para descargar. Usted puede mejorar cuanto quiera el generador.

Ejecute el generador y siga los pasos 1,2,3.


  1. Seleccione la imagen. La imagen seleccionada se muestra junto al botón.
  2. Seleccione la clase que acaba de crear. El cuadro de texto va a mostrar el nombre de la clase seleccionada.
Existe un botón con letras en rojo, por si desea limpiar el contenido del campo USER si existe cualquier otro dato. Seleccione ese botón para limpiar el campo.

3.- Seleccione el botón "Insert image" y la imagen se inserta instantáneamente en el campo USER de la clase. Seleccione otra imagen (1) y agréguela (3). Cuando haya agregado sus imágenes, cierre el generador y examine la clase como tabla (browse). En el campo USER encontrará mucha información nueva. He empleado delimitadores en el generador builder <name> y </name> <picture> y </picture> para separar las imágenes insertadas.

Vea, por favor que las imágenes están tal como las ha insertado por tanto puede saber las que hay cuando necesite asignarlas. Cierre la clase abierta antes como una tabla.

Ahora abra su clase como clase y agréguele un nuevo método - ProcessImages.

Agregue el siguiente código al método ProcessImages
* procesa las imágenes
* abre la clase como una tabla
USE (THIS.CLASSLIBRARY) IN 0 ALIAS xClass SHARED
* toma solamente el archivo que deseamos
SELECT USER FROM xClass WHERE NOT EMPTY(USER) AND baseclass="image" INTO CURSOR 
userStr
* guarda las imágenes
LOCAL cPixStr,nPix,cPixname,cPixContents
nPix = 1
cPixStr = ALLTRIM(USERSTR.USER)
* no hace falta nada más, así que las cerramos
USE IN SELECT("userstr")
USE IN SELECT("xClass")
* hace un lazo en los datos extrayendo las imágenes
DO WHILE .T.
  cPixname = STREXTRACT(cPixStr,[<name>],[</name>],nPix)
  IF EMPTY(cPixname)
    EXIT
  ENDIF
  cPixcontents = STREXTRACT(cPixStr,[<picture>],[</picture>],nPix)
  * agrega una propiedad para guardar ese valor
  This.AddProperty("pix"+TRANSFORM(nPix),cPixContents)
  nPix = nPix + 1 
ENDDO
En el INIT de la clase llame al método
This.ProcessImages()
La clase image está completa.

Para probar la clase image, cree un nuevo formulario y agréguele una instancia de ImageXML.bbImage. Como puede ver en el código, las imágenes son almacenadas en propiedades añadidas en tiempo de ejecución se llaman pix1, pix2, etc para tantas imágenes como haya agregado.

Entonces, abra el evento Init del objeto image y agregue este código:
* ejecuta el código de la clase padre
DODEFAULT()
* asigna valores a la propiedad PictureVal – pix1 o pix2 o pix3 etc.
This.PictureVal = This.Pix1
Si está utilizando el objeto imagen como un botón y quiere que la imagen cambie cuando el ratón entre y salga, entonces escriba este código en el evento MouseEnter:
This.PictureVal = This.pix2
Y cámbielo cuando se vaya el ratón:
This.PictureVal = This.pix1
Esto es todo lo que hay que hacer. No hay imágenes que buscar, ni relojes de arena que ver. Este método para el uso de imágenes incluso trabaja en tiempo de ejecución cuando el VCX es compilado dentro del EXE y puede ser abierto y leído como una tabla.

Como he mencionado, el generador es muy sencillo y puede ser mejorado fácilmente. Hasta ahora, con el ejemplo que se ofrece, solamente se admite una clase imagen por biblioteca de clases; pero cambiando el código en ProcessImages, más de unobjeto imagen puede ser agregado fácilmente a la biblioteca de clases.

Este es el formulario de pruebas con la imagen asignada:



y el cambio de imagen cuando se mueve el ratón sobre el.



No hay comentarios. :

Publicar un comentario