Reporte de la Conferencia DevEssentials 06.06.2004 –
Sesión tarde
Por Amby
La tarde comienza con una sesión sobre el Visual
MaxFrame Professional creado por Drew Speedie, (Microsoft Most Valuable
Professional) uno de los actuales expertos en VFP más reconocidos a nivel
internacional, por su amplio dominio de la herramienta, sus innumerables
artículos y participaciones en Conferencias…. Y por su rapidez al hablar…
¡Qué rápido habla Drew! … les cuento una pequeña anécdota…Yo estaba
advertida de su rapidez al hablar, su apellido Speed (Velocidad), le viene
muy bien… pero bueno, me atraía un poco el tema y fui a probar suerte…de lo
que me alegro, fui a las tres sesiones y quedé encantada. Para colmo de
bienes, en esta sesión sobre Visual MaxFrame Professional, Drew Speedie
tuvo la cortesía de preguntarme si le entendía, o si debía hablar más
despacio J, “Va todo bien,
muchas gracias”, le dije J
Pues bien, el Visual MaxFrame Professional (VMP) es un
framework escrito en VFP por el propio Drew y otros integrantes de su
equipo. Es una aplicación orientada a objetos para crear aplicaciones VFP.
VMP está creada para ser utilizada por:
- desarrolladores de aplicaciones VFP que no tengan
su propia aplicación framework y puedan aprovechar todas las ventajas de
utilizar el VMP
- experimentados desarrolladores de Kox2x que
comprenden los modelos de objetos y eventos en Visual FoxPro y quieren
evitar crear su propios componentes reutilizables para sus aplicaciones.
Visual MaxFrame Professional NO es un “generador
de aplicaciones” – no se puede utilizar para crear automáticamente
formularios de entrada de datos basados en un diccionario de datos. Si lo
desea, puede crear su propio asistente empleando los formularios base y
otros componentes de la aplicación VMP.
Visual MaxFrame Professional SI es una “aplicación
framework” el desarrollador puede subclasear las clases del VMP en
sus propios objetos personalizados. VMP es comprensible, flexible, le
permite decidir el nivel de personalización que desea utilizar. Proporciona
formularios base Listos para utilizar (Ready-to-use)
VMP no es POO puro, en algunos casos conserva las
construcciones nativas de VFP, como es el caso de los menús, que no se han
modificado y conservan la misma estructura de los menús desde FoxPro 2.0.
VMP permite desarrollar aplicaciones con las
siguientes arquitecturas:
-
1-capa (código y datos VFP)
-
2-capas (código VFP y datos remotos)
-
n-capas (cualquier presentación de capas, incluyendo una aplicación
de escritorio VMP, VMP objetos de negocio en el medio y cualquier base de
datos)
Es más, VMP permite cualquier combinación de estas
estructuras.
Ningún framework puede trabajar perfectamente para
todos en todas las aplicaciones, por lo que los creadores de VMP han
preparado el framework lo más abierto posible para personalizar y
complementar según las necesidades de cada desarrollador. Drew dice que, en
cuanto se tienen en cuenta condiciones particulares, el framework pierde su
esencia general, y el objetivo para el que es diseñado. Por eso, VMP
permite crear clases a partir de formularios base (SCX) o clases base
(VCX), tampoco impone su propio diccionario de datos, ya que, como he dicho
antes, no es un generador de aplicaciones, así que puede utilizar su propio
diccionario o el de terceros.
Para conocer más sobre este interesante y muy útil
framework ver el sitio
http://www.visionds.com/vmpsite/
Allí encontramos, entre otras muchas cosas, la
información del producto, les recomiendo especialmente el Help y
Tutoriales, paso a paso de esta aplicación, que están fantásticos, cada
elemento de código está debidamente documentado, con toda la información
necesaria para que el usuario menos experto en VMP se haga con sus
ventajas.
Esta aplicación, sus demos, tutoriales, etc, está en
idioma inglés;… pero!! Está preparada para que el IDE aparezca en muchos
idiomas, uno de ellos el español, cuyas traducciones estuvieron a cargo de
Alex Feldstein, (Microsoft VFP MVP)
Ante una pregunta que comenzaba con “… y yo podría con
VMP lograr…” la respuesta de Drew fue SI,… sin importar lo que viene
detrás…porque el desarrollador sigue siendo el dueño de su código y es
libre de personalizar a su antojo, utilizando o no las herramientas de VMP.
Me ha resultado muy interesante este primer contacto
con VMP. Ahora, no me despido de Drew, porque tenemos la siguiente sesión
sobre instanciar y destruir formularios, una de las sesiones que espero con
más interés… luego de tanto café, me voy a buscar un refresco…
Lo que nunca te ha contado tu madre sobre
instanciar / destruir formularios (What Your Mother Never Told You
About Instantiating/Destroying Forms) por Drew Speedie
Bueno, pues este título es más que atractivo, es casi
enigmático, vamos a ver….
Instanciar y destruir formularios es aparentemente un
proceso muy directo – El evento Init es el encargado de inicializar
mientras que el evento Destroy se encarga de destruir el formulario. ¿Ya
está? No, que va, hay mucho más que esto.
Desafortunadamente es muy fácil dañar la secuencia
normal de eventos para inicializar formularios, con resultados que son muy
difíciles de depurar.
Lo primero que quiero decirles es que por gentileza de
Drew Speedie, podremos contar con todo el artículo correspondiente a esta
sesión, traducido al español y contaremos con todos los ejemplos que fueron
presentados. Gracias Drew!! Sin duda serán de gran utilidad.
Por el momento intento comentar algunos de los
aspectos que más llamaron mi atención y me parecen básicos para enfocar
este aspecto y dejarles al menos una pista de sobre qué estuvo el tema. En
estos días que tanto hablamos de VFP 9.0, este es un tema que no está para
nada afectado por la nueva versión, incluso, la gran mayoría de los
ejemplos son prácticamente reproducibles en cualquier versión, con
excepción de los casos donde se utiliza la función BINDEVENT(), nativa
desde VFP 8.0
Las bases de LISAG
(Load-Init-Show-Activate-GotFocus) y QRDU (QueryUnload- Release- Destroy-
Unload)
Secuencia nativa de eventos al instanciar:
1.
Evento Form.DataEnvironment.OpenTables (Tablas/vistas en el Entorno
de datos DataEnvironment no están en uso USE() o abiertas)
2.
Evento Form.DataEnvironment.BeforeOpenTables (Tablas/vistas en el
Entorno de datos DataEnvironment no están en uso USE() o abiertas)
3.
Evento Form.Load (Tablas/vistas en el Entorno de datos
DataEnvironment están en uso USE() o abiertas)
4.
Evento Init de cualquier objeto cursor en DataEnvironment
5.
Evento Form.DataEnvironment.Init
6.
Evento Init de cada miembro del formulario que es instanciado
7.
Evento Form.Init
8.
Evento Form.Show
9.
Evento Form.Activate
10.
Evento When del primer control del formulario en el orden de
tabulación (tab order)
11.
Evento Form.GotFocus
12.
Evento GotFocus del primer control del formulario en el orden de
tabulación
Secuencia native al
destruir
Si el formulario se cierra hacienda clic en "X" en
la esquina superior derecha o la opción Cerrar en la esquina derecha del
título.
1.
Método Form.Release
2.
Evento Form.Destroy
3.
Evento Destroy para cada uno de los miembros del formulario.
4.
Evento Form.Unload (Tablas/vistas en el Entorno de datos
DataEnvironment están en uso USE() o abiertas)
5.
Evento Form.DataEnvironment.CloseTables (Tablas/vistas en el Entorno
de datos DataEnvironment no están en uso USE() o abiertas)
6.
Evento Form.DataEnvironment.Destroy
7.
Evento Destroy para cada cursor en el DataEnvironment
Si se cierra el formulario por una llamada a
THISFORM.Release(), por ejemplo, desde un botón Aceptar el primer paso es
en evento Form.QueryUnload, luego se suceden los eventos del 2 al 7 como se
ha mostrado antes.
Y no olvidemos el orden de instanciar que es de
adentro hacia fuera en los contenedores, es decir el último Init es el del
formulario o conjunto de formulario, para destruir pasa lo contrario, de
afuera hacia dentro.
Bueno, todo va bien; pero… si un formulario tiene
establecidas las propiedades DEClass y DEClassLibrary (disponibles desde
VFP 8.0), entonces cambia, el objeto DataEnvironment se instancia
completamente antes del Form.Load
Entonces… empiezan los problemas poco intuitivos que
se pueden presentar, algunas cosas a saber son:
-
diferencia entre los eventos que ocurren en dependencia de la forma
en que se cierre el formulario,
-
diferencias en lo forma de colocar los comandos SETs que se afectan
por sesión privada de datos, si se utiliza la clase DataEnvironment y sus
propiedades
-
Las llamadas a métodos del formulario desde métodos del
DataEnvironment llamados antes del Form.Load son ignoradas
-
Las llamadas a métodos del formulario desde métodos que se llaman
antes del Form.Load disparan estos métodos SI están definidos ena clase
form de la que hereda el formulario actual. Uffff qué enredo, ¿no? Pues,
sí, y todo queda debidamente demostrado con ejemplos.
-
Si en los eventos en el DataEnvironment, que se disparan antes del
Form.Load se miran los valores de las propiedades del formulario y todas
son .F., pero si mira los valores en la clase padre, son los deseados.
¿Dónde está el alcance de los comandos SET en Sesiones
privadas de datos? Pues, la respuesta es… depende! Y depende de si se
utiliza DE o no. A criterio del autor, es más consistente y fácil de
mantener, el no uso del DataEnvironment; pero, en tiempo de diseño
recomienda utilizar DE para:
-
arrastrar los cursores desde el DE para instanciar los grids
-
arrastra los campos para adicionar controles cuyos ControlSource ya
estarán definidos y se puede obtener ya la etiqueta correspondiente, en
dependencia de lo que exista en el cursor.
-
Establecer el ControlSource de cada control desde la ventana
propiedades, seleccionando del control combobox con los cursores actuales.
Pero… en tiempo de ejecución recomienda abrir las
tablas manualmente, garantizando el control de errores correspondiente e
individual para cada una.
Drew nos alerta sobre los peligros y consecuencias a
veces imprevisibles que conlleva el alterar la secuencia natural de los
eventos.
Ej. Colocar al final del Form.Init esta línea de
código
THIS.cmdOK.SetFocus()
Esto va a provocar que la secuencia no sea LISAG, sino
LIAGIS, porque, cuando el Init encuentra esta línea va directo a hacer el
Activate para poder dar el foco al comando OK, y luego sigue la secuencia
normal del Show. Vimos otros ejemplos en este tema.
De forma análoga Drew se refirió a los aspectos y
problemas que se producen a la hora de destruir el formulario. Para que un
objeto sea liberado / destruido correctamente todas las referencias
externas al mismo, deben ser liberadas. Si no son eliminadas las
referencias a los objetos contenidos, el contenedor no es liberado, si el
contenedor es un formulario, pues no se puede liberar.
Ejemplo:
ORCleanup1.PRG crea 2 dos
instancias de ORCleanup1.SCX para mostrar el problema
1.
DO ORCleanup1
2.
En la Instancia 2 del formulario, selecciono cualquiera de los
checkboxes de abajo para guardar la referencia a un miembro del formulario
en la instancia 1.
3.
Intento cerrar la instancia 1del formulario: Hago Clic en el botón
OK, la "X" en la esquina superior derecha o en Cerrar en la esquina
superior izquierda. La instancia 1 del formulario no se deja cerrar debido
a que le cuelga una referencia.
4.
Cierro la instancia 2 del formulario. En cuanto se cierra la
instancia 2, se cierra la instancia1, porque el Destroy ya se había
disparado, solo estaba esperando porque fueran liberadas las referencias
externas a sus objetos.
Seguimos viendo más ejemplos que matizan los problemas
que se suceden al no tener en cuenta las referencias de objetos.
Sobre el caso particular de _Screen.ActiveForm, nos
comenta que conociendo cuando THISFORM se convierte en _Screen.ActiveForm,
nos permitirá hacer cosas muy útiles empleando las referencias de objeto.
Pero… cuidado, que si el formulario activo contiene uno o más controles
ActiveX, _Screen.ActiveForm puede devolver la referencia al control y no al
formulario activo.
Pues… aquí terminamos, hay mucho más en el escrito que
vamos a traducir y según Drew Speedie, hay mucho más de lo recogido en la
presentación y el escrito, por lo pronto, me queda muy claro que he
disfrutado mucho de esta sesión, que he aprendido mucho y que este es un
tema al que voy a recurrir, lo primero será traducirlo y probarlo todo en
el menor tiempo posible, Gracias nuevamente Drew, sencillamente genial!!
Bueno, me voy a ver algo de diseño de Bases de datos,
desde la mano de un experto, Andy Kramek, esto aquí es de lujo pasas de un
experto a otro.
Diseño de Bases de datos (o cómo hacerlo bien, la
primera vez) Designing a database (or how to do it right, first time)
Andy Kramek (Microsoft Most Valuable Professional cada año desde 1998 y
Microsoft Certified Professional en Visual FoxPro)
Continuamente se ven cambios en la elaboración de la
base de datos. Puede ser una DBC para una nueva aplicación o para agregar
un módulo o nueva funcionalidad a una aplicación existente.
Antes de siquiera comenzar a pensar en definición de
tablas, normalización de datos e integridad referencial, necesitamos estar
seguros que la base de datos refleja el modelo correcto de la situación
real que se necesita programar. No importa si utilizará bases nativas de
VFP, SQL Server o cualquier otra. Esta es la base para el éxito de
cualquier Base de datos.
La aplicación de algunas reglas nos permite hacerlo
bien, desde el inicio. Andy parte por los conceptos iniciales, hace
distinción entre dato, que es con lo que una base de datos
tiene que tratar e información, que es con lo que trata la
aplicación que utiliza la base de datos… pero… ¿qué es y para qué es una
base de datos? Una base de datos ha de cumplir dos funciones:
-
debe controlar el proceso de almacenar información
-
debe asegurar la consistencia del dato con su definición
Sobre los tipos de aplicaciones que utilizan bases de
datos para utilizar información, Andy nos dice, que son infinitos; pero se
pueden dividir en tres:
-
Sistemas de líneas de negocio (gran cantidad de entrada de datos y
muchos usuarios interactuando),
-
Sistemas de Administración de información (análisis de datos y
preparación y preparación de informes),
-
Sistemas de almacenamiento de datos (procesamiento de datos).
Los datos son de diferentes tipos:
-
Esenciales –Son significativos para la aplicación que
utiliza la base de datos. No pueden ser derivados, deben ser introducidos
de forma explícita. Los cambios sobre ellos deben ser controlados.
-
Proceso - Son significativos para la aplicación que
utiliza la base de datos; pero pueden ser derivados de otros datos ya
presentes en la Base de datos.
-
Soporte – No son significativos; pero dan soporte a la
aplicación y deben ser introducidos explícitamente.
Los patrones de estructuras de tablas son: plano,
tablas relacionales, tablas reflexivas (jerárquicas), tablas verticales
(pares de atributo/valor)
Para los patrones relacionales existen:
1.- Tabla única
2.- Tabla de extensión.-
relación Uno a Uno
3.- Tablas con relación
Uno a Muchos
4.- Tablas con relación
Mucho a Uno
5.- Tabla con relación
Muchos a Muchos (es necesaria una tabla intermedia)
6.- Tabla con relación
auto-referencial
Todos estos casos fueron ejemplificados.
Luego pasamos a las reglas. Las reglas pueden ser:
-
de Bases de datos (concernientes al almacenamiento de datos, las
reglas de integridad de los datos),
-
de Negocios (interpretación de la información, son implementadas en
la capa intermedia) y
-
de Validación (gobiernan la admisibilidad de los datos en el
contexto de la aplicación).
Casi al final, nos dice Andy, que lo más importante es
seguir un orden secuencial desde el inicio, para diseñar y normalizar una
base de datos, se puede resumir en:
-
Identificar el tipo de sistema
-
Modelar el sistema y los procesos claves.
-
Identificar los orígenes de datos para los procesos (esenciales,
procesos o suporte)
Andy nos deja literatura para complementar este
estudio:
1.- Data Model Patterns:
Conventions of Thought
por David C. Hay; Published by
Dorset House, 1996 (ISBN: 0932633293)
2.- Database Design for Mere
Mortals: A Hands-On Guide to Relational Database Design
por Michael Hernandez; Published
by Addison-Wesley, 2003 (ISBN: 0201752840)
3.- Data Access Patterns:
Database Interactions in Object-Oriented Applications
por Clifton Nock; Published by
Addison-Wesley, 2003 (ISBN: 0131401572)
Ya se que está en inglés; pero es lo que hay.
Han terminado las sesiones; pero no la jornada de hoy.
Nos queda un panel con algunos ponentes, espero que sea interesante.
Panel de discusión sobre tecnologías de Microsoft -
con algunos ponentes de DevEssentials 2004 – sesión extra
Se encontraban presente casi todos los ponentes, en el
panel o en el público, la idea era que los expertos respondieran a un grupo
de preguntas preparadas previamente por los asistentes a la Conferencia
DevEssentials 2004.
Los presentes cubrieron los 3 temas del evento: Visual
FoxPro, SQL y .Net.
Sobre las nuevas tecnologías de Microsoft
relacionadas con .Net, se retomaron las opiniones y temas
relacionados con Yukon y Widbey. Cada panelista dio su valoración sobre las
ventajas y desventajas del paso a tecnología .Net, apreciándose diversos
puntos de vista, tal y como nos pasa a nosotros en los foros, en la
Conferencia los expertos enfocan el tema de .Net desde ángulos diferentes,
sobre todo, era fácil distinguir la herramienta de trabajo de cada uno.
Algunas de las cuestiones fueron la curva de
aprendizaje, la posibilidad de reutilizar código y otras.
Tony Feltman (MVP y prestigiosa conferencista)
dijo que depende mucho de lo que paguen los usuarios por las nuevas
características que se pueden aportar. Dice que hay experiencia de años
acumulada en VFP, mucha más que en otras plataformas, algunos de los
presentes llevan 15 años trabajando con Fox y el .Net es muy joven todavía.
Andy Kramek (MVP y especialista en Diseño de
Bases de datos) apunta que depende de los objetivos de la aplicación, los
recursos del usuario y que al final era una decisión de compromisos,…como
siempre.
Comentaron sobre el IDE de VFP 9.0 y
aunque a algunos les gusta como está y a otros les hubiera gustado verlo
diferente, todos coincidieron que las nuevas características aportadas en
la versión 9.0 favorecen la productividad.
Sobre lo mejor de VFP 9.0 también hubo
opiniones diversas, les dejo breves comentarios:
Tony Feltman: IntelliSense en campos memo
Richard Hundhausen (experto en .Net):
Soporte extendido para SQL
Doug Henning: Posibilidad de anclar (dock) las
ventanas de usuario.
Rick Shummer: Todo lo que me haga más
productivo, me ayude a recordar los nombres de variables y propiedades, el
IDE, etc
Luego vino una pregunta más distendida, cada uno contó
algo bien interesante sobre lo que se sentía orgulloso de haber logrado o
descubierto, algunos, como Doug Henning, reconocieron que muchos de
sus descubrimientos más interesantes habían sido de pura casualidad.
Comentaron sobre las clases y métodos de .Net,
algunos consideran que son excesivas y otros como Tamar Granor,
consideran que en VFP, muchas de las clases y métodos nativos son ignoradas
por los desarrolladores, que utilizan solo una parte de ellos.
Luego… pues luego, la verdad es que ni se cómo empezó
todo; pero estaban hablando del trabajo en las comunidades de
desarrolladores.
Rick Shumer habló de las horas que dedica a
escribir artículos, preparar conferencias y atender a las preguntas en los
foros y que viendo tanta gente que acudía a las conferencias, podía resumir
con un ¡Gracias por venir!
Doug Henning tuvo palabras de aliento y dijo:
¡Sigan adelante!
El resto de los del panel también tuvo frases de apoyo
y aliento; pero yo ya no les escuchaba, me di cuenta de que era la
oportunidad que necesitaba para divulgar nuestro trabajo en la comunidad de
desarrolladores de VFP de habla hispana, preparé unos garabatos y con
bastante miedo escénico y temor a que me traicionara el inglés pedí la
palabra cuando terminaron de opinar los panelistas.
Mi comentario fue de forma general el siguiente (lo
pude reconstruir gracias a las notas que me había preparado)
Amby: “Quisiera pedir disculpas por mi
imperfecto idioma inglés, espero que puedan entenderme.
Hablando de las comunidades de desarrolladores me
encuentro representando a los desarrolladores de VFP de habla hispana, que
se encuentran distribuidos en España, Latinoamérica, EEUU y otros muchos
países del mundo.
Represento especialmente a PortalFox, sitio web en
idioma español, con más usuarios y mayor actividad e información de VFP en
idioma español. Desde PortalFox se organizó la traducción del IDE y
archivos de la Ayuda de VFP 8.0, lo cual ha sido de gran ayuda para todas
aquellas personas que no pueden leer en inglés. Hemos realizado, además,
traducciones de numerosos artículos de prestigiosos autores, muchos de los
cuales, aquí presentes, nos han dado su autorización y les estamos muy
agradecidos. Gracias a ellos y a las traducciones que se publican en
PortalFox, esa información está disponible para los desarrolladores de
habla hispana.
Si Alex quiere comentar algo más…” (me refería a Alex
Feldstein, Microsoft VFP MVP y unos de los expertos con mayor prestigio en
nuestro foro).
Alex Feldstein: “El problema que existe en las
comunidades de habla hispana, y pasa lo mismo en portugués, es la falta de
literatura, No hay libros en español ni portugués. Por otra parte la
situación de los países latinoamericanos no permite la presencia de muchos
desarrolladores en estos eventos y para España resulta también muy costoso.
Por lo que las traducciones, son la forma de hacer llegar la información”
De nuestras intervenciones se derivaron otros
comentarios de algunos presentes que se interesaron en algunos detalles del
proceso de traducción, así como la traducción de artículos. Hubo
felicitaciones por el trabajo realizado, deseos de éxitos y nos invitaron a
seguir adelante con nuestro trabajo.
Lo más bonito fue lo que vino después, a partir de ese
momento y hasta el final del evento, varios ponentes tuvieron la gentileza
de acercarse para ofrecer sus trabajos para ser traducidos.
La noche fue larga… tuvimos conversaciones con Ken
Levy – Product Manager de VS Microsoft, esta conversación, por su
importancia la reportamos aparte.
¡Qué día! Me fui muy feliz a descansar… Mañana nos
vemos en el tercer y último día de sesiones.
Espero que les haya resultado de utilidad,
Saludos,
Ana
www.amby.net
|