Page 1 of 1

Yo deseo...

PostPosted: Thu Sep 02, 2010 10:06 am
by triumvirato
Pues me gustaría contar con una cláusula, rutina, etc... al estilo WHEN en muchos controles, pero para mostrar u ocultar el objeto. Sería un "HIDEWHEN <lExp>", pues lo más común es mostrar los controles. Según el usuario, el módulo, etc. hay información que se debe o no mostrar, lo que obliga en muchos casos a duplicar código o a usar en la definición de cada control los métodos Show(), Hide(). Ahora en cada control uso un Iif( <exp>, oObj:Show(), oObj:Hide ), por ejemplo. No sé si hay algo implementado de este estilo o se pueda hacer más fácilmente...

Saludos!

Re: Yo deseo...

PostPosted: Fri Oct 15, 2010 7:04 am
by Antonio Linares
Siempre puedes usar un AEval( oDlg:aControls, { | oControl | ... } ) para recorrer todos los controles y hacerles lo que necesites :-)

Re: Yo deseo...

PostPosted: Sat Oct 30, 2010 2:40 am
by jll-fwh
Hola triumvirato:

Se hace como dice el maestro, pero para darte una ayudita te comento a groso modo:

No tienes que duplicar ningun modulo, yo desde la version 1.0 de FW, tengo las mismas funciones de siempre. yo creo una funcion con la declaracion de los objetos a utilizar, con una pequeña diferencia a ti creo, yo no uso una variable por objeto, si el procedimento en muy grande necesitarias un monton de variables y seria un lio.

Por ejemplo, si necesito 15 objetos, sean los que sean, get, say, xbrowse, etc me declaro un array de 15 elementos para los objetos ( ocampos) , un array de 15 elementos para el contenido (ccampos ), y en el caso de uitlizar combobox o otro objeto que requiera informacion adicinal, creo el array acampo, estos array como estaticos:

STATIC cCampos
STATIC oCampos
STATIC aCampos

En la funcion principal declaro el tamaño de los array:

cCampos := Array( 15 )
oCampos := Array( 15 )
aCampos := Array( 15 )

los objetos se quedarian asi:

REDEFINE GET oCampos[1] VAR cCampos[1] ID 100 OF oDlg FONT oFont PICTURE "@!" VALID Localizar()

en el ON INIT en todos los proceso tengo una funcion que se llama Inicia(), esta funcion lo que hace es inicializar cada elemento del array con el valor que corresponde.

Luego segun sean por ejemplo, altas, bajas, modificaciones, etc.

Yo tengo creadas como te he comento funciones que me activan, desactivan, refrescan, focos, etc los campos, y solo le pasas el nombre del objeto y los elementos a realizar la acccion, y con una sola linea de codigo manejas todos los obejtos, ejemplo:

Para activar:
MiActivar( @oCampos, 3, 6 )

Para Desactivar:
MiTodosDesactivar( @oCampos, 1, Len( oCampos ) )


Para refrescar:
MiDosRefresca( @oCampos, 1, Len( oCampos ) )

para poner el foco en un campo determinado:
MiFoco( @oCampos, 1 )

Para refrescar un browse/xbrowse, etc, con posicionamiento en el 1 reg, o no, segun interese:
RefrescaBRW( oGrid, .T ) o RefrescaBRW( oGrid, .F. )

En fin, para cualquier cosa que se pueden hacer con los objetos tengo funciones generales que me sirve para generar una unica linea de codigo, es decir, mis fuentes suelen ser muy pequeños, al usar este metodo.

En la declaracion de los elementos de los array, solo tienes que tener en cuenta, que con objetos tambien hay que hacerlo es, poner como comentario que es cada elemento, como comentario, el numero de elemento de cada ccampos[x] y ocampos[x] siempre corresponden al mismo objeto.

cCampos[1] // codigo
cCampos[2] // Denominacion
...etc

Para cuando haya que hacer modificaciones, saber que elemento es cada cosa, a mi este metodo me ha ido de lujo desde siempre;

Espero que este pequeño ejemplo te pueda ayudar en algo.

un saludo
JLL