26 de octubre de 2004

VFP 9.0. Mejoras en diseñador de formularios y clases

Autor: Drew Speedie
Traducido por: Ana María Bisbé York


Resumen

Esta sesión intenta documentar y demostrar todas las características de VFP 9.0 que mejoran, o en cualquier caso afectan, la forma en que se diseñan formularios y clases. Por tanto, el énfasis está hecho en el IDE de VFP, y el diseñador de clases y formularios en particular, pero tenemos otras características de VFP 9.0 que están directamente relacionadas con la productividad mientras creamos formularios y clases.

Mejoras en Ficha Propiedades (Properties)

El área donde VFP 9.0 tiene más cambios relativos al diseño de formularios y clases es sin dudas la ficha Propiedades, así que voy a comenzar por aquí. La Figura1 muestra una parte de la ficha Propiedades mejorada, donde lo primero que salta a la vista son los iconos que preceden las Propiedades, Eventos, y Métodos (PEM). Lo que no está mostrado en la Figura 1 es que el icono indica además la visibilidad de cada PEM. El icono para PEMs ocultos incluye un candado y el icono para PEMs protegidos, incluye una llave.


Figura 1: Ficha Propiedades - lo primero que se observa es el icono que identifica cada elemento

Estos iconos ya son familiares porque se han visto en la lista desplegable de miembros de IntelliSense, el cuadro desplegable para el método, del editor del método Snippet en VFP 8.0 y otros entornos de desarrollo orientados a objeto. Incluir los iconos lo hace más productivo ya que la clave visual identifica instantáneamente cada PEM por el tipo como se ven en la lista.

Fuente personalizada en la ficha Propiedades

Una vez que comienza a agregar propiedades personalizadas y establecer explícitamente PEMs, verá otras características que son bienvenidas. Para comenzar, la ficha Propiedades admite personalización de la fuente y los colores (quizás ha notado que la fuente en la figura 1 es Tahoma). Como se ve en la figura 2 hay además otras características nuevas, las iremos viendo por turnos comenzando con la personalización de la fuente.


7 de octubre de 2004

Lo que nunca te contó tu madre sobre instanciar y destruir formularios

Sesión original: What Your Mother Never Told You About Form Instantiation and Destruction (DevEssentials 2004)
Autor: Drew Speedie
Traducido por: Ana María Bisbé York



Resumen

Esta sesión intenta ayudar a entender mejor la secuencia normal de eventos en VFP cuando los formularios se instancian y se destruyen ... existe mucho más los eventos Init y Destroy. Dotado de este conocimiento, puede depurar problemas e implementar buenas técnicas como las que vamos a demostrar aquí.

Todos los ejemplos se pueden probar en VFP 8 o VFP 9, porque no se utiliza código específico para VFP 9. La mayoría de los ejemplos se aplican a todas las versiones de VFP; pero algunos de los ejemplos utilizan las funciones BINDEVENT()s y las características de la clase DataEnvironment que fueron agregadas en VFP 8.

La mayoría de los ejemplos se pueden ejecutar desde la interfaz DEMO.APP, aunque algunos deben comenzar con CLEAR ALL/CLOSE ALL, y deben ejecutarse desde la ventana de comandos. DEMO.APP es el único archivo incluido con la presentación. Una vez que selecciona los botones Run (Ejecutar) o Source (Fuente) desde la interfaz, los archivos con código fuente para ese ejemplo se copian al disco, en la carpeta donde se encuentra DEMO.APP. A partir de ahí, puede ejecutar los ejemplos desde la ventana de comandos. La mayoría pueden ser ejecutados directamente desde la interfaz DEMO.APP.

Las bases LISAG (Load-Init-Show-Activate-GotFocus) y QRDU (QueryUnload- Release- Destroy- Unload)

Para implementar exitosamente los escenarios de instanciación y destrucción de un formulario, lo primero que debe entender es la secuencia nativa de los eventos.

Instanciación

Como se demuestra en LISAG_QRDU.SCX, aquí está la lista de eventos que ocurren durante la instanciación:
  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
Destrucción

1 de octubre de 2004

Calcular Digito de Verificacion de NIT (Colombia)

Rutina para calcular el digito de verificacion de NIT (para Colombia)
********************************************************
* FUNCION         : Nit_DV
* FUNCION         : Devuelve el Digito de Verificacion de un Nit (COLOMBIA)
* PARAMETROS      : Numero de Nit a Calcular
* RETORNO         : Digito de Verificación
* AUTOR           : Nelson Cortes (nelson_cortes@tutopia.com)
********************************************************
FUNCTION Nit_DV(_Nit)
    LOCAL _TipoRet, lnRetorno, Arreglo_PA, WSuma, WDato, WDig_Ver, I
    _TipoRet = VARTYPE(_Nit)
    DO CASE
    CASE _TipoRet == "C"
        _Nit = ALLTRIM(_Nit)
    CASE _TipoRet == "N" OR _TipoRet == "Y"
        _Nit = ALLTRIM(STR(_Nit))
    OTHERWISE
        =MESSAGEBOX("El valor de entrada NIT no se ha podido procesar.",0+48,_SCREEN.cNomApp)
        RETURN
    ENDCASE
    DIMENSION Arreglo_PA(15)
    Arreglo_PA(1) = 71
    Arreglo_PA(2) = 67
    Arreglo_PA(3) = 59
    Arreglo_PA(4) = 53
    Arreglo_PA(5) = 47
    Arreglo_PA(6) = 43
    Arreglo_PA(7) = 41
    Arreglo_PA(8) = 37
    Arreglo_PA(9) = 29
    Arreglo_PA(10) = 23
    Arreglo_PA(11) = 19
    Arreglo_PA(12) = 17
    Arreglo_PA(13) = 13
    Arreglo_PA(14) = 7
    Arreglo_PA(15) = 3
    lnRetorno = 0
    WDato=RIGHT(SPACE(15)+ALLTRIM(_Nit),15)
    WSuma=0
    WDig_Ver=0
    FOR I = 1 TO 15
        WSuma=WSuma+(VAL(SUBSTR(WDato,I,1))*Arreglo_PA(I))
    ENDFOR
    WSuma=MOD(WSuma,11)
    IF(WSuma=0 .OR. WSuma=1)
        lnRetorno = WSuma
    ELSE
        lnRetorno = 11 - WSuma
    ENDIF
    IF _TipoRet == "C"
        RETURN ALLTRIM(STR(lnRetorno))
    ELSE
        RETURN lnRetorno
    ENDIF
ENDFUNC
Oscar Arley Yepes Aristizabal