20 de agosto de 2007

Incrustar Imágenes II - La clase inteligente Treview VFP

Artículo original: Embed II The Smart VFP Treeview Class
http://weblogs.foxite.com/bernardbout/2007/07/14/embed-ii-the-smart-vfp-treeview-class/
Autor: Bernard Bout
Traducido por: Ana María Bisbé York

En el artículo anterior, Embed Your Images describí como se pueden incrustar imágenes en una clase. (Nota de la traductora: Este artículo ha sido publicado bajo el título "Incrustar Imágenes (Bernard Bout) Traducción")

En este escrito, voy a mostrarles la mejor forma de incrustar esas imágenes así como un archivo de configuración dentro de una clase. La clase en cuestión es una clase Treeview mostrada antes en este escrito: VFP is very very cool (Nota de la traductora: Este artículo ha sido publicado bajo el título "Visual FoxPro es muy muy bueno")

El ejemplo de la clase y formularios se pueden descargar desde:
http://weblogs.foxite.com/bernardbout/attachment/4366.ashx

Todo lo que necesita utilizar esta clase es ejecutar el formulario xmldashbuilder.scx y configurar cómo será la apariencia del Treeview. Puede añadir elementos, enlazar imágenes, configurar comandos y se ejecutará cuando se seleccione un nodo del Treeview.

Figura 1 - El generador


Figura 2 - El generador con ayuda


Luego, es simplemente cuestión de arrastrar la clase al formulario, redimensionarla, y ya está.
Una vez que tiene el código fuente, puede abrir fácilmente la clase y ver cómo lo he hecho.
Básicamente, el Treeview está manejado por una tabla que admite tres niveles para cada nodo. Esto suele ser suficiente. Las imágenes se enlazan con cada nodo y son incrustadas a lo largo con la tabla dentro de la propia clase, por lo que no se necesitan más archivos externos, solamente la clase. El generador no es necesario una vez que la clase se haya configurado. Si se necesita una configuración posterior, el generador debe estar en el mismo directorio que la clase.

Puede colocar cualquier comando que sea ejecutado, como se hace en un menú de VFP. Vea, por favor, los comandos de ejemplo que se incluyen en la clase para ejecutar el formulario del generador.
Si necesita hacer cambios en la configuración, llame al generador, hágalos y guárdelos. Estos cambios aparecerán en su formulario la próxima vez que lo ejecute.

Debido a un requerimiento del ActiveX ImageList, las imágenes deben encontrarse externamente, por lo que la clase lo extrae automáticamente a un directorio temporal según sea necesario, en tiempo de ejecución. La clase no va a eliminar los archivos, por lo que serán reutilizados si se utiliza la clase nuevamente. Si es necesario, puede fácilmente agregar esta eliminación de imágenes en el evento Destroy de la clase.

Figura 3. La clase en el formulario

Actualización: 12 de febrero 2009 

He quitado las entradas MemberData de la clase y el formulario. Esta clase trabajará tanto en VFP8 y VFP9. Descargar el archivo adjunto a continuación.
Adjunto: xmltreedash0209.zip

17 de agosto de 2007

MySQL Client-Server Applications with Visual FoxPro

Nuevo libro de Whil Hentzen sobre como desarrollar aplicaciones Cliente-Servidor con VFP y MySql, logrando una combinación poderosa y económica.

Este libro también trata sobre como instalar, configurar y conectar MySql y Visual FoxPro.



Titulo: MySQL Client-Server Applications with Visual FoxPro
Autor: Whil Hentzen
Editado por: Ted Roche
Lenguaje: Inglés
ISBN: 1-930919-70-0
Páginas: 414
Precio: U$S 49.95 (impreso) U$S 29.95 (formato PDF de 8 MB.)
Fecha de publicación: Agosto de 2007

Contenido

Chapter 1: Why Client-Server? Why VFP? Why MySQL?
Chapter 2: Development and Deployment Scenarios
Chapter 3: Installing MySQL on Windows
Chapter 4: Installing MySQL on Linux
Chapter 5: Configuration of Users and Hosts
Chapter 6: Connecting VFP to MySQL
Chapter 7: Configuring MySQL
Chapter 8: The Interactive Use of MySQL
Chapter 9: Under the Hood: Where MySQL Keeps Its Data
Chapter 10: Creating Data Sets from Scratch
Chapter 11: Populating a MySQL Database: LOAD DATA INFILE
Chapter 12: Populating a MySQL Database Programmatically
Chapter 13: Advanced Data Issues
Chapter 14: Constructing SQL to Avoice SQL Injection
Chapter 15: Religious Wars: Remote Views, CursorAdapters, and SQL PassThrough
Chapter 16: A Client-Server State of Mind
Chapter 17: xBase to SQL Conversion Issues
Chapter 18: A Client-Server User Interface for Querying
Chapter 19: A Client-Server User Interface for Add/Edit/Delete
Chapter 20: Relational Integrity
Chapter 21: Getting Started with Stored Procedures
Chapter 22: Deployment

Mas información: http://www.hentzenwerke.com/catalog/mysqlvfp.htm

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.