6 de enero de 2006

Guardar la posición y el tamaño de un formulario

Muchas veces nuestros usuarios desean que al volver a ingresar a un formulario, éste mantenga el tamaño y la posición de la última vez que se ejecutó. Aquí mostraremos una forma simple de realizar esta tarea con un ejemplo al cual Uds. podrán darle la funcionalidad y la complejidad que sus aplicaciones requieran.

¿Qué utilizaremos?

A partir de Visual FoxPro 8.0 se agregó la cláusula NAME a los comandos SCATTER y GATHER, que nos permite actualizar las propiedades de un objeto con el registro actual de una tabla, y a la inversa, reemplazar el registro actual de una tabla a partir de las propiedades de un objeto.

Por ejemplo si tenemos una tabla con los nombres de campos que coincidan con los nombres de las propiedades de un objeto, el siguiente código actualizará las propiedades del objeto con los valores del registro actual de la tabla:
USE MiTablaSCATTER NAME Objeto ADDITIVE

¿Qué haremos?

Lo que vamos a hacer, es crear una tabla libre con nombre "_Prop_" mas el nombre físico del archivo del formulario utilizando la función SYS(1271). En el caso de crear el formulario programáticamente (como en el ejemplo) la función SYS(1271) retorna .F., con lo cual agregaremos "Form" al nombre de la tabla. Los campos de la tabla solo serán las propiedades que nos dan la posición y el tamaño del formulario (Top, Left, Width y Height)  y el color de fondo (BackColor).

Importante: Tener en cuenta que las tablas libres solo soportan nombres de campos de hasta 10 caracteres de longitud. En el caso de este ejemplo, las propiedades a guardar son Top, Left, Width, Height y BackColor con lo cual no tendremos inconvenientes ya que ninguna supera los 10 caracteres de largo, pero si deseamos poder guardar y recuperar propiedades de mas de 10 caracteres de longitud, debemos reemplazar la tabla libre por una tabla contenida en una base de datos que soportan nombres de campos de hasta 128 caracteres de longitud.

En el método Init del formulario tomamos los valores de las propiedades con en comando SCATTER NAME ThisForm ADDITIVE y en el método Destroy guardamos los valores con el comando GATHER NAME ThisForm.

El código de ejemplo

Copie el código siguiente en un archivo PRG, ejecútelo, y cambie el tamaño, posición y color de fondo del formulario. Luego salga y ejecútelo nuevamente y verá que conserva las propiedades que ha cambiado.
PUBLIC oMiForm
oMiForm = CREATEOBJECT("MiForm")
oMiForm.SHOW(1)
RETURN

DEFINE CLASS MiForm AS FORM
  TOP = 10
  LEFT = 10
  HEIGHT = 180
  WIDTH = 324
  CAPTION = "Guardar posición, tamaño y color de fondo"
  BACKCOLOR = RGB(200,220,255)
  NAME = "frmMiForm"

  ADD OBJECT cmdColor AS COMMANDBUTTON WITH ;
    TOP = 12, LEFT = 12, HEIGHT = 27, WIDTH = 132, ;
    CAPTION = "Cambiar BackColor", NAME = "cmdColor"

  ADD OBJECT cmdSalir AS COMMANDBUTTON WITH ;
    TOP = 48, LEFT = 12, HEIGHT = 27, WIDTH = 132, ;
    CAPTION = "Salir", NAME = "cmdSalir"

  ADD OBJECT lblAyuda AS LABEL WITH ;
    AUTOSIZE = .T., WORDWRAP = .T., BACKSTYLE = 0, ;
    CAPTION = "Cambie la posición, tamaño y color del " + ;
    "formulario. Salga del formulario y ejecutelo nuevamente.", ;
    FONTSIZE = 12, LEFT = 12, TOP = 96, NAME = "lblAyuda"

  PROCEDURE INIT
    THISFORM.InicializarPropiedades()
    THISFORM.TomarPropiedades()
    THISFORM.RESIZE
  ENDPROC

  PROCEDURE DESTROY
    THISFORM.GuardarPropiedades()
  ENDPROC

  PROCEDURE RESIZE
    THISFORM.lblAyuda.WIDTH = THISFORM.WIDTH - 24
  ENDPROC

  PROCEDURE InicializarPropiedades
    LOCAL lcScx
    *-- Creo propiedades
    THISFORM.ADDPROPERTY("Prop_Alias")
    THISFORM.ADDPROPERTY("Prop_Tabla")
    *-- Nombre de la tabla de propiedades
    lcScx = SYS(1271,THISFORM)
    THISFORM.Prop_Alias = "_Prop_" + IIF(EMPTY(lcScx),"Form",JUSTSTEM(lcScx))
    THISFORM.Prop_Tabla = FORCEEXT(FULLPATH("")+ THISFORM.Prop_Alias, "DBF")
    *-- Si no existe la tabla la creo
    IF NOT FILE(THISFORM.Prop_Tabla)
      CREATE TABLE (THISFORM.Prop_Tabla) FREE ;
        (TOP I, LEFT I, WIDTH I, HEIGHT I, BACKCOLOR I)
      APPEND BLANK
      GATHER NAME THISFORM
      USE IN SELECT(THISFORM.Prop_Alias)
    ENDIF
  ENDPROC

  PROCEDURE TomarPropiedades
    *-- Tomo las propiedades de la tabla
    SELECT 0
    USE (THISFORM.Prop_Tabla)
    SCATTER NAME THISFORM ADDITIVE
    USE IN SELECT(THISFORM.Prop_Alias)
  ENDPROC

  PROCEDURE GuardarPropiedades
    *-- Guardo las propiedades en la tabla
    SELECT 0
    USE (THISFORM.Prop_Tabla)
    GATHER NAME THISFORM
    USE IN SELECT(THISFORM.Prop_Alias)
  ENDPROC

  PROCEDURE cmdColor.CLICK
    THISFORM.BACKCOLOR = GETCOLOR(THISFORM.BACKCOLOR)
  ENDPROC

  PROCEDURE cmdSalir.CLICK
    THISFORM.RELEASE
  ENDPROC

ENDDEFINE
Para terminar

La idea de este código para publicar en PortalFox fue tomada de uno de los ejemplos de la aplicación "Solution" que viene con Visual FoxPro. Este formulario de ejemplo (que viene a partir de VFP 8.0) lo podemos ver ejecutando:

DO FORM (HOME(2) + "Solution\Toledo\ScatterName")

Hasta la próxima.

Luis María

No hay comentarios. :

Publicar un comentario