FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour ¿En que control estaba el foco?
Posts: 234
Joined: Tue Oct 25, 2005 12:39 AM
¿En que control estaba el foco?
Posted: Thu Apr 20, 2006 01: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

Posts: 234
Joined: Tue Oct 25, 2005 12:39 AM
Se puede con bLostFocus
Posted: Thu Apr 20, 2006 03: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.

Posts: 458
Joined: Tue Mar 14, 2006 07:26 PM
¿En que control estaba el foco?
Posted: Thu Apr 20, 2006 05: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

Un Saludo,

Joaquín Martínez
Posts: 458
Joined: Tue Mar 14, 2006 07:26 PM
¿En que control estaba el foco?
Posted: Thu Apr 20, 2006 05: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

Un Saludo,

Joaquín Martínez
Posts: 234
Joined: Tue Oct 25, 2005 12:39 AM
Gracias Joaquin
Posted: Thu Apr 20, 2006 09: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.

Posts: 458
Joined: Tue Mar 14, 2006 07:26 PM
¿En que control estaba el foco?
Posted: Thu Apr 20, 2006 09: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

Un Saludo,

Joaquín Martínez
Posts: 234
Joined: Tue Oct 25, 2005 12:39 AM
Gracias
Posted: Fri Apr 21, 2006 04:30 PM

Joaquin,
Gracias por la aclaración.

Continue the discussion