¿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 ENDDEFINEPara 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.