¿En que control estaba el foco?

¿En que control estaba el foco?

Postby fleal » Thu Apr 20, 2006 1:53 am

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

Postby fleal » Thu Apr 20, 2006 3:18 pm

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

Postby jmartial » Thu Apr 20, 2006 5:49 pm

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: 458
Joined: Tue Mar 14, 2006 7:26 pm

Postby jmartial » Thu Apr 20, 2006 5:53 pm

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

Gracias Joaquin

Postby fleal » Thu Apr 20, 2006 9:16 pm

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

Postby jmartial » Thu Apr 20, 2006 9:45 pm

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

Gracias

Postby fleal » Fri Apr 21, 2006 4:30 pm

Joaquin,
Gracias por la aclaración.
fleal
 
Posts: 234
Joined: Tue Oct 25, 2005 12:39 am
Location: México, DF


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 82 guests