¿En que control estaba el foco?

Post Reply
fleal
Posts: 234
Joined: Tue Oct 25, 2005 12:39 am
Location: México, DF

¿En que control estaba el foco?

Post 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
fleal
Posts: 234
Joined: Tue Oct 25, 2005 12:39 am
Location: México, DF

Se puede con bLostFocus

Post 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.
jmartial
Posts: 457
Joined: Tue Mar 14, 2006 7:26 pm

Post 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
jmartial
Posts: 457
Joined: Tue Mar 14, 2006 7:26 pm

Post 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
fleal
Posts: 234
Joined: Tue Oct 25, 2005 12:39 am
Location: México, DF

Gracias Joaquin

Post 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.
jmartial
Posts: 457
Joined: Tue Mar 14, 2006 7:26 pm

Post 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
fleal
Posts: 234
Joined: Tue Oct 25, 2005 12:39 am
Location: México, DF

Gracias

Post by fleal »

Joaquin,
Gracias por la aclaración.
Post Reply