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.
- Seleccione la imagen. La imagen seleccionada se muestra junto al botón.
- Seleccione la clase que acaba de crear. El cuadro de texto va a mostrar el nombre de la clase seleccionada.
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 ENDDOEn 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.Pix1Si 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.pix2Y cámbielo cuando se vaya el ratón:
This.PictureVal = This.pix1Esto 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
Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.