ShouthwestFox
Inicio

PreConferencia

Encuentros

Vie 14 Mañana

KeyNote

Vie 14 Tarde

Drew Speedie

Sáb 15 Mañana

Sáb 15 Tarde

Dom 15 Mañana

Galerías

... a Conferencias

 
Anuncios






 
© PortalFox

Southwest Fox 2005

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.

  1. Tanto XMLTOCURSOR como CURSORTOXML son  insuficientes en la realización de algunas tareas. Por ejemplo, cuando hay más de una tabla.
  2. 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
  3. Convertir DataSet de .NET cuando no tenemos control sobre el lado .NET (problemas con campos MEMO)
  4. Crear XML compatibles con DataSet de .NET
  5. Añadir campos a XML entrantes en el momento de crer los cursores (campos calculados, enlaces, otros campos, etc)
  6. Crear cursores a partir de XML jerárquicos y crear  al vuelo índices y relaciones
  7. Leer XML con esquemas muy complejos
  8. Extraer determinada parte de un documento XML
  9. Salidas  a formatos XML no habituales.
  10. 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

 


Todas las marcas y los logos utilizados en este sitio son propiedad de sus respectivos dueños.
Los artículos, noticias y comentarios son propiedad y responsabilidad de sus respectivos autores.
Copyright © 2000-2007 PortalFox. Todos los derechos reservados.