¿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
Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.