Page 1 of 1

¿En que control estaba el foco?

PostPosted: Thu Apr 20, 2006 1:53 am
by fleal
Buenas...
Si le doy click a un botón, supongo que se botón ahora tiene el foco ¿Cierto?. Pero, ¿ hay forma de saber quien tenía el foco ?

Gracias
Fernando

Se puede con bLostFocus

PostPosted: Thu Apr 20, 2006 3:18 pm
by fleal
Por si a alguien le sirve.

static nFoco := 0


REDEFINE GET aGets[5] VAR aCampos[5] ID 105 OF oFld:aDialogs[1] UPDATE PICTURE "@9" ; // IdenNumero

En cada get actualizar nFoco

aGets[5]:BLostFocus :={|| nFoco := 5 }

donde nFoco es una static que guarda el número de get. Después en el botón para avanzar al siguiente registro..

REDEFINE BUTTON aBtns[2] ID 502 OF oDlg CANCEL ; // Adelante
ACTION ( Adelante( aGets, @aCampos, aSays ) )


static function Adelante( aGets, aCampos, aSays )
EMPLEADO->( dbskip() )
.... leo los datos, los asigno a aCampos, regresco los gets y al final de mi función...

aGets[nFoco]:setfocus()

Asi es como regreso el foco a la misma posición donde estaba antes de dar click al botón.

return nil


Desde luego, tiene un defecto. Si ustéd usa un color de fondo en el Get... este ya no funcionará por que estamos usando justamente BLostFocus.
Para eso hay que tocar el TGet.prg pero me ocuparé de eso más al rato.

PostPosted: Thu Apr 20, 2006 5:49 pm
by jmartial
Fernando,

Si no me equivoco, creo que se puede hacer mucho más fácil.

Si tienes un botón oBtn1 que al hacer click quieres saber el control que tenía el foco, sería:


oBtn1:bGotFocus := { | oBtn1, hAnteriorControl| Mifunc(hAnteriorControl ) }


Function Mifunc(hAnteriorControl )

haces lo que quieras
......

// Te posicionas en el que estabas antes del click
SetFocus( hAnteriorControl )

Return Nil


Un Saludo y ya me cuentas si te funciona,
Joaquín

PostPosted: Thu Apr 20, 2006 5:53 pm
by jmartial
Perdón,

Ese ejemplo es cada vez que coja el foco el Botón, al hacer click sería:


oBtn1:bGotFocus := { | oBtn1, hAnteriorControl| oBtn1:cargo :=hAnteriorControl }

Y el la función del click:

SetFocus( oBtn1:cargo )

Un Saludo y así están las 2 posibilidades,
Joaquín

Gracias Joaquin

PostPosted: Thu Apr 20, 2006 9:16 pm
by fleal
Joaquin,
eliminé lo que había hecho y lo deje asi:


REDEFINE BUTTON aBtns[2] ID 502 OF oDlg CANCEL ; // Adelante
ACTION ( Adelante( aGets, @aCampos, aSays ) )

aBtns[2]:bGotFocus := { | oBtn, oFld| oBtn:cargo := oFld }

Siempre será mejor una linea a poner una por cada get como yo lo tenía.
Dentro de la función coloco.

static function Adelante( aGets, aCampos, aSays )
... bla, bla, ..

SetFocus( aBtns[2]:cargo )

return nil

Gracias, quedo más legible y me ha ahorrado mucho código.

PostPosted: Thu Apr 20, 2006 9:45 pm
by jmartial
Fernando,

me alegro que te haya funcionado, yo no lo había probado.

Pero, creo que te ha quedado un concepto erróneo:

aBtns[2]:bGotFocus := { | oBtn, oFld| oBtn:cargo := oFld }


oFld creo entender que te ha parecido es el objeto que tuvo el foco, pero es que no es un objeto, es el Handle de un objeto. Normalmente es la data hWnd de cualquier control en Fwh. Así que, sólo esa apreciación, para que no intentes hacer con el handle lo que se hace con un objeto.

Un Saludo,
Joaquín

Gracias

PostPosted: Fri Apr 21, 2006 4:30 pm
by fleal
Joaquin,
Gracias por la aclaración.