Viernes 14 de Octubre - Jornada de la mañana
PorAmby
Temas:
GDI+ Técnicas y Ejemplos - Craig Boyd
Diez usos
prácticos del XMLAdapter de Visual FoxPro - David Stevenson
Extender Visual
FoxPro con Visual FoxPro - Doug Hennig
Es el primer día de Conferencia, el plan es muy ambicioso, 6
presentaciones, el Keynote y en la noche una sesión en pleno para recordar
a Drew Speedie. Tomo mi primer café con Andy Kramek, tengo las primeras
charlas del día y me voy en tiempo al local, porque no me quiero perder
detalle de lo que vamos a ver.
Tengo gran curiosidad por ver en funcionamiento, en vivo y en directo
como se suele decir, a la FFC GDI+. He intentado algunas cosas, logrando
parte de ellas; por lo que espero aclararme en aquellas que no he
conseguido aun. Antes de venir tuve oportunidad de leer tres de lo
artículos de la serie que, sobre este tema, está escribiendo y publicando
el autor en la Revista FoxTalk 2.0 (http://www.pinpub.com/ME2/Default.asp)
Recomiendo mucho esta serie, y aun no se ha escrito todo.
Así que, veamos que hay de nuevo en
GDI+ Técnicas y Ejemplos - (VFP
Painting 101: GDI+ Techniques and Examples) de la mano de Craig Boyd
Sobre esta presentación , hay mucho que ver, mucho que probar y mucho
que aplicar.
Craig Boyd mostró varios ejemplos del funcionamiento de la nueva clase
GDI+ que se incorporó a las FoxPro Foundation Classes en VFP 9.0. Lo
primero que hizo Craig fue recomendar la serie de tres artículos que fueron
publicados en la Revista FoxTalk 2.0, "Using GDI+ in VFP 9.0 with the FFC
Library" por Walter Nicholls publicados de agosto a octubre de 2004. Estos
artículos detallan en forma extensa todos los componentes de esta clase y
sus ejemplos nos pueden llevar de la mano sobre cómo utilizarlos.
Las 14 clases que envuelven las funcionalidades de GDI+, ellas son:
- GpGraphics (el centro del universo GDI+, es la encargada de realizar
el dibujo)
- GpImage (clase base para imágenes)
- GpBitmap (Una imagen que consiste en una matriz bidimensional de
pixels)
- GpBrush (clase base para brochas)
- GpSolidBrush (color sólido de relleno)
- GpHatchBrush (plantillas de trama de relleno)
- GpPoint (X-Coord/Y-Coord de la localización en un plano
bidimensional)
- GpSize (tamaño)
- GpRectangle (combinación de localización y tamaño)
- GpPen (para dibujar líneas, curvas, y contornos)
- GpColor (ARGB)
- GpFontFamily (fuentes)
- GpFont (describe aspectos del texto tales como nombre, estilo y
tamaño)
- GpStringFormat (presentación del texto, alineación y dirección)
Sobre GDI+ Flat API nos comenta que es el sucesor de Windows Graphic
Device Interface. Viene con Window XP y superior. Se puede descargar
gdiplus.dll en Platform SDK Redistributable para Windows 98 – Win2k.
Se puede dividir en tres categorías fundamentales:
- Vectores bidimensionales para gráficos (líneas, curvas y formas)
- Tipografía (texto con fuentes varias, tamaños y estilos)
- Imágenes (tratamiento de imágenes y archivos)
Flat API, por su parte tiene 603 funciones API, llama a GdiplusStartup
antes de hacer cualquier otra llamada a GDI+ y al terminar, llama a
GdiplusShutdown.
Para lograr sus objetivos Craig observó las deficiencias en el uso del
evento Paint del formulario, programó ganchos a los eventos de Windows para
lograr doble-buffering. Además, entre otras cosas, aprovechó las novedades
de VFP 9.0 (WM_PAINT y WM_ERASEBKGND)
La presentación se estuvo basando todo el tiempo en ejemplos. Craig fue
mostrando las dificultades con las que se fue enfrentando y las soluciones.
Vimos un ejemplo clásico, una imagen sobre un formulario que no se
redimensiona con el formulario. Se utilizó GDI+ Flat Api, en el segundo
caso, con _GDIPlus Class Library la imagen parpadeaba molestamente si
intentábamos redimensionar el formulario. En ejemplos sucesivos muestra
cómo solucionó este problema.
Muestra ejemplos en los que varía con absoluta comodidad el tipo de trazo
(pen) y la brocha (brush). El trazo puede tener diferentes colores,
diferentes anchos, puede ser continuo, con líneas y puntos discontinuos y
combinados. Por su parte la brocha puede ser sólida, rallada, con textura
variada, con colores en degradado, y así, infinidad de combinaciones.
Otro tanto ocurre con las formas: podemos representar líneas, arcos y
elipses, rectángulos, polígonos y curvas cardinales y de Bezier.
Con este ejemplo vemos como se pueden cambiar los valores de los
controles y el efecto que se produce inmediato sobre la imagen. Los
colores, la textura, el tipo de figura, rotación, etc.

No menos interesante resultaron los efectos que se pueden obtener sobre
el texto: sombras, relieve, grabados, y otro largo etc... ¿Es que no
habrá limites? Veamos algunos ejemplos del aspecto final que pueden
tener algunas combinaciones de estilos y colores sobre los textos.

Craig se refirió al tan importante trabajo con imágenes, tanto en
formularios, como en informes, que gracias al nuevo motor de informes puede
invocar a esta clase y trabajar con imágenes y gráficos desde VFP. Esto nos
ayudará a solucionar en muchos casos el dilema de la selección del tipo de
generador de gráfico.

En la imagen que tenemos arriba vemos como a partir de un cursor podemos
lograr infinidad de combinaciones en dependencia de los valores que
asignemos a los controles, los colores, tipo de gráfico (línea, barras,
tarta o pie) Desde esta misma pantalla se puede cambiar el origen de datos,
agregar fondo o no al gráfico, vea el ejemplo de abajo, sin color de fondo.

Bueno,
pues yo quedé encantada, superó todas mis espectativas. Al fin entendí lo
que significaba alpha, resulta que es el efecto contrario al color que se
muestre. Creo que hay que comprobar cada ejemplo y dominar la técnica. Una
vez hechos con la forma de trabajo de GDI+ daremos a nuestras aplicaciones
un valor añadido. Muchas gracias a Craig Boyd por la gran cantidad de
ejemplos y la forma en que se los ha preparado para dejarnos la mayor
variedad posible de opciones. Ha estado realmente bien.
Todos los ejemplos están a libre disposición desde el sitio del
proyecto SednaX (haga
clic aquí)
Me voy a buscar algo de beber, que no sea café, no me deja de doler
la cabeza... una faena, sin dudas; pero bueno, creo que no es nada que no
se solucione con Tylenol y agua :) Me encontré con Esparta que había visto
"What's new in SQL Server" por Craig Bernston
Pues me dispongo a cambiar totalmente de tema, vamos a ver qué cuenta
David Stevenson de XMLAdapter, clase muy potente; pero desafortunadamente
no es masivamente empleada, por limitaciones en su comprensión. Por esta
razón, esta sesión, explicará, a través de diez casos de uso, ejemplos de
correcta utilización y mostrará la potencia de las clases XMLAdapter,
XMLTable y XMLField.
Esta vez coincidimos Esparta y yo en la sesión
Diez usos
prácticos del XMLAdapter de Visual FoxPro. (Ten Practical Uses for
the XMLAdapter) por David Stevenson lo primero que nos
comenta es que XMLAdapter no va a solucionar todas nuestras necesidades en
cuanto al trabajo con XML.
Suena a mal comienzo; pero no, veamos ... XMLAdapter se agregó
como clase base nativa en VFP 8.0, y ha sido mejorado en VFP 9.0. Puede
leer un XML y devolver cursores VFP a partir de éste. Puede analizar
cursores VFP y crear XML a partir de ellos. Puede ser subclasesada y es
completamente programable y requiere MSXML 4.0... ¿ven? ya esto suena
mejor ... menos mal.
Consta de otras dos clases bases: XMLTable y XMLFields. Algo primordial
en el trabajo con XMLAdapter son las colecciones, están aplicadas tanto en
los campos de XMLTable como en las tablas de XMLAdapter. David Stevenson se
detiene a comentar la diferencia que existe dentro del esquema entre el
Alias y el Name. Por una parte, es posible cambiar el Alias, por ejemplo en
una tabla que forma parte de la colección que contiene el XMLAdapter; pero
no es posible cambiar el nombre, provocaría un error, ya que se va a
emplear como Description Name dentro de la colección y se perdería entonces
esta referencia.
Hay alternativas al uso del XMLAdapter, veamos: XMLTOCURSOR() y
CURSORTOXML(), XML DOM, CursorAdapter, STREXTRACT() y otras funciones de
tratamiento de cadenas.
Para
leer un XML y obtener un cursor tenemos a nuestra disposición: LoadXML(),
Attach() y XMLTable.ToCursor(). Hay que tener en cuenta que si el documento
XML no tiene esquema entonces hay que crear primeramente las colecciones
para que luego puedan ser actualizados los cursores sobre esa estructura.
Para hacer el proceso contrario y crear XML a partir de uno o varios
cursores de VFP tenemos: AddTableSchema() y ToXML().
Ahora mencionaré las 10 tareas que propuso solucionar David
Stevenson. Pido disculpas por no realizar apenas comentarios sobre ellas.
Esta sesión carece de texto ni de ejemplos que se puedan descargar de la
Web y no fue mucho lo que logré asimilar directamente en la sesión. Aun
así, llegue a ustedes lo que pude captar. David Stevenson me dijo que
escribiría sobre este tema, veremos si en el futuro hay posibilidades de
ampliar.
- Tanto XMLTOCURSOR como CURSORTOXML son insuficientes en la
realización de algunas tareas. Por ejemplo, cuando hay más de una tabla.
- Convertir DataSet de .NET en Cursor(es). En este y el resto de temas
relativos a .NET, David Stevenson, recomienda leer los artículos de Rick
Stralh
- Convertir DataSet de .NET cuando no tenemos control sobre el lado
.NET (problemas con campos MEMO)
- Crear XML compatibles con DataSet de .NET
- Añadir campos a XML entrantes en el momento de crer los cursores
(campos calculados, enlaces, otros campos, etc)
- Crear cursores a partir de XML jerárquicos y crear al vuelo índices
y relaciones
- Leer XML con esquemas muy complejos
- Extraer determinada parte de un documento XML
- Salidas a formatos XML no habituales.
- Subclasear XMLAdapter para aprovechar todas sus ventajas.
Pues hasta aquí este tema, hablo con David Stevenson, porque soy
consciente de no haber aprovechado al máximo y me da la mala noticia de que
no hay escritos. Esta vez será poco para comentar, pensé... de verdad que
lo siento, ... pero nada de desanimarse.... seguimos. .... ¿Qué vendrá
ahora? Tenemos 6 tracks a la vez, no damos a basto para todos. Ahhhh; pero
si es Doug Hennig que viene a hablarnos de Extensibilidad, voy volando, es
en el teatro y aunque hay más capacidad siempre las sesiones de Doug Hennig
se repletan.
Doug Hennig nos comenta sobre cómo
Extender Visual FoxPro
con Visual FoxPro, (Extending VFP with VFP ) y comienza
recordando como desde el inicio VFP ofreció formas para permitir "tocar" en
parte su código y adaptarlo a nuestras necesidades. Uno de los mayores
logros de Visual FoxPro, es que su Interfaz de desarrollo (IDE) es
extensible. Aplicando la extensibilidad se puede elevar la productividad y
crear herramientas que faciliten nuestro trabajo, como pueden ser editores
de propiedades, mejoras en cuadros de diálogo, etc. Y VFP 9.0 ofrece en
este tema el máximo de posibilidades visto hasta ahora: los diálogos del
Diseñador de informes se encuentran entre el código fuente XBase que se
distribuye con la aplicación, se pueden enlazar eventos de ventanas y mucho
más...
Vamos directo al primer ejemplo. Doug ha querido sustituir el diálogo
Nueva propiedad / método que viene nativo en VFP para agregarle otras
funciones o cambiar algunas que tenía. Digamos que no quiere salir cada vez
que se agregue una propiedad, porque se pierde tiempo volviendo a invocar
el editor. Por suerte ya tenemos traducido y publicado en PortalFox la
explicación detallada de cómo lograrlo. El artículo se titula "Extender el
IDE de VFP 9 con MENUHIT y MENUCONTEXT" y la URL es:
http://www.portalfox.com/modules.php?op=modload&name=Sections&file=index&
req=viewarticle&artid=54 Como resultado de su investigación obtuvo un
diseñador con esta apariencia.

El siguiente ejemplo que vimos fue el de crear un Editor de propiedades.
En este caso voy a recomendar estos dos artículos de Doug Hennig que
también aparecen traducidos en PortalFox:
Doug se refiere a la posibilidad de crear editores para propiedades de
usuario propias a partir del nuevo Generador de MemberData quien brinda
espacio para colocar un código script que cumpla determinada funcionalidad.
Esto es muy fácil de hacer y nos reporta una ganancia en productividad que
a veces no alcanzamos a calcular. Veamos un ejemplo:
<memberdata name="NombreDePropiedad" type="property" script="do NombredelPrograma"/>
A su vez, el Generador de MemberData también es extensible brindando más
posibilidades aun. De todas formas tiene algunas desventajas: Es difícil de
depurar, se recomienda SYS(2030,1) y el empleo de la tabla de IntelliSense
en lugar de _MemberData, si desea utilizar clases en versiones anteriores
que no admiten _MemberData. Además, hay que reconocer que no se pueden
pasar parámetros a estos generadores y que no tenemos propiedades que
podemos configurar ...en particular no dudo que algunas de estas cosas
tengan solución con la inventiva de los desarrolladores del FoxTeam y de la
Comunidad VFP.
Luego pasamos a la descripción del framework que ha creado Doug Hennig
para la generación de editores de propiedades. Esto lo podremos ver con
todo detalle en un futuro, ya que tenemos la posibilidad de traducir todo
el contenido de esta sesión y publicar los ejemplos. Como resultado
podemos ver la configuración que se realiza desde el Editor Memeber data y
el resultado final en la ventana Propiedades, donde tenemos una lista
desplegable con los valores posibles.


Hay otro caso de propiedades que alternan su valor con doble clic,
pueden ser, por ejemplo, propiedades que tengan valores lógicos (verdadero
/ falso); pero es válido también para propiedades con valores numéricos. En
este caso Doug reconoce haberse inspirado en una idea mostrada por otro de
los grandes, Rick Shummer.
En este caso, veamos como desde el Editor de MemberData aparece este
texto en Script:
do 'PropertyEditor' with 'Toggle', 'nTest' y en la segunda ficha, donde
dice User-Defined vemos cómo se definen los atributos y valores para esa
propiedad. El efecto que se produce al hacer doble clic en la ventana
propiedades es alternar de 1 en 1 entre los valores mínimos = 1 como se ve
en la figura y 3 que es el valor asignado a highvalue.
Doug comenta que esta idea se puede utilizar para muchas variantes y
agradece a Rick Stralh por servir de beta tester para llegar a esta clase,
por sus sugerencias y especialmente por haber aportado la idea que dio
inicio a todo este desarrollo.
Pasamos a ver IntelliSense a fondo. Estoy convencida de que la
mayoría de los desarrolladores no explotamos al máximo las posibilidades
que brinda IntelliSense. Este es otro de los temas sobre los que ya hay
información traducida:
-"IntelliSense para Aplicaciones" de Toni M. Feltman
http://www.portalfox.com/article.php?sid=1156 y "Desactivar la
expansión no deseada de IntelliSense" de Mike Lewis
http://www.portalfox.com/modules.php?op=modload&name=Sections&file=index&req=viewarticle&artid=40
En PortalFox hay varios artículos más que se pueden consultar para
ampliar sobre este tema. Y aun hay varios sin traducir.
La tabla FoxCode permite la incorporación de nuevas combinaciones, por
ejemplo podemos asignar mp para modify proyect. Pero hay otras
combinaciones más complejas y muy útiles como puede ser un código estándar
para la apertura y cierre de tablas, un texto estándar para encabezar cada
programa o código en métodos propios y un caso muy interesante que mostró
que fue agregar la variable a la lista de variables locales a la vez que la
utilizamos por primera vez en un programa.
Me explico, sabemos que las variables han de ser declaradas para
garantizar que sean locales y mueran al salir del procedimiento actual,
pues bien, Doug Hennig ha agregado una nueva entrada a su tabla de
IntelliSense y ha empleado un código escrito por Andy Kramek y Marcia
Akins, que se publicó en "MegaFox: 1002 Things You Wanted to Know About
Extending Visual FoxPro" publicado por Hentzenwerke Publishing (www.hentzenwerke.com)
y que es altamente recomendado. Lo primero es definir una nueva opción de
menú y agregarle la combinación de teclas (para Doug Hennig es Alt+6) para
que se active el programa que se encarga de realizar la actualización.
Este código garantiza que si se oprime la combinación de teclas escogida
(Alt+6) la variable sobre la que nos encontramos aparece en la lista de
variables locales. Wow !!! ¿A que sí? ¿Cuántas veces no nos hemos
olvidado de declarar una variable?
Ahora pasamos a un tema desconocido, para la inmensa mayoría, me
incluyo. Pues se trata del nuevo espacio de nombre My
El espacio de nombre (namespace) My, aparece en Visual Basic.NET 2005.
Hace que las clases del .NET Framework sean más fáciles de encontrar y nos
permite escribir menos código. Hay un ejemplo en el artículo de Duncan
Mackenzie’s MDSN “Navigate the .NET Framework and Your Projects with My” (http://msdn.microsoft.com/msdnmag/issues/04/05/VisualBasic2005/default.aspx).
La siguiente versión o proyecto de VFP - Sedna va a incluir también el
espacio de nombre My. Dos aspectos relevantes relacionados son que permite
IntelliSense en tiempo de diseño y jerarquía de clases en tiempo de
ejecución. La forma en que My va filtrando las opciones a mostrar (de la
misma forma que se hace en .NET) se garantiza a través de IntelliSense, y
el código tiene asociado en la tabla FoxCode. Es de gran ayuda en tiempo de
diseño. Otro tanto ocurre en tiempo de ejecución, veamos la tabla para la
clase MyBase

Doug Hennig, para finalizar, nos mostró un editor para esta llenar esta
clase, tiene el siguiente aspecto.

Ha
terminado esta presentación. No se ustedes; pero a mi me ha colmado de
nuevos conocimientos. Siento mucha admiración por Doug Hennig. Sus
artículos y sesiones combinan su genialidad con una forma didáctica e
instructiva de decir. Esta sesión la vamos a traducir, así que a todos
llegará con lujo de detalles los ejemplos y las ideas expuestas. Al final
me quedo para felicitar y pedirle a Doug Hennig que me firme el libro, con
tan buena suerte que también se acercaron a felicitar Toni Feltman y Rick
Shummer, otros dos autores. Muy emocionada espero que firmen Doug y Toni y
me hago una foto, libro en mano, con estos tres gurús.
Ha sido una mañana agotadora, no ha habido tiempo que perder...
Esparta vio otra de David Stevenson, "Subclassing CursorAdapter". Ahora,
por fin, un receso, vamos a almorzar...
Nos vemos en la próxima entrega, Reporte de la Conferencia Southwest
Fox 2005 - Keynote.
Saludos,
Ana
www.amby.net
|