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
¿En que control estaba el foco?
Se puede con bLostFocus
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.
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.
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
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
Gracias Joaquin
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.
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.
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
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