Page 1 of 1

cual control tuvo el foco

PostPosted: Wed Aug 10, 2011 10:14 pm
by Francisco Horta
Hola foro,
tengo un dialogo con 30 controles de todo tipo, y tengo un boton que abre un dialogo extra, cuando salga de ese boton quiero que el foco quede en el control que estaba hasta antes dar click al boton, como se cual era ese control?
salu2
pak-o

Re: cual control tuvo el foco

PostPosted: Thu Aug 11, 2011 1:04 pm
by FranciscoA
Hola, mira si este post te resuelve.
viewtopic.php?f=6&t=2745&start=0&hilit=que+control+tiene+el+foco

También puedes probar con:
nFocus = AScan( oDlg:aControls, { | o | o:lFocused } )

Saludos

Re: cual control tuvo el foco

PostPosted: Thu Aug 11, 2011 6:32 pm
by Francisco Horta
francisco, ya habia probado el oDlg:aControls y me da el foco en el control actual no el anterior, probe con el ejemplo del link que me pones, probe de 2 formas diferentes y con ninguna me funciono, hice esto:

REDEFINE BUTTONBMP aoBtn[3] ID 402 OF oDls BITMAP "MONITOS" TEXTRIGHT ;
ACTION SetFocus(aoBtn[3]:cargo) ;
WHEN VAL(nPax) > 1 UPDATE
aoBtn[3]:bGotFocus := {|oBtn,oCtlOld| oBtn:cargo:=oCtlOld,;
Ocupantes(@cNom2,@cPat2,@cMat2,;
@cNom3,@cPat3,@cMat3,;
@cNom4,@cPat4,@cMat4,VAL(nPax)) }

REDEFINE BUTTONBMP aoBtn[3] ID 402 OF oDls BITMAP "MONITOS" TEXTRIGHT ;
ACTION ( Ocupantes(@cNom2,@cPat2,@cMat2,;
@cNom3,@cPat3,@cMat3,;
@cNom4,@cPat4,@cMat4,VAL(nPax)),;
SetFocus( aoBtn[3]:cargo )) ;
WHEN VAL(nPax) > 1 UPDATE
aoBtn[3]:bGotFocus := {|oBtn,oCtlOld| oBtn:cargo := oCtlOld }

alguna otra sugerencia?
gracias
pak-o

Re: cual control tuvo el foco

PostPosted: Thu Aug 11, 2011 7:05 pm
by Francisco Horta
probando de esta otra manera y tampoco funciona...

Local nHandle:=0

REDEFINE BUTTONBMP aoBtn[3] ID 402 OF oDls BITMAP "MONITOS" TEXTRIGHT ;
ACTION ( Ocupantes(@cNom2,@cPat2,@cMat2,;
@cNom3,@cPat3,@cMat3,;
@cNom4,@cPat4,@cMat4,VAL(nPax)),;
SetFocus(nHandle),;
nHandle:=0 ) ;
WHEN VAL(nPax) > 1 UPDATE
aoBtn[3]:bGotFocus := {|oBtn,oOld| nHandle:=oOld}

dentro de la funcion Ocupantes abro un dialogo para captura de informacion
algo mas????
:-(
pak-o

Re: cual control tuvo el foco

PostPosted: Thu Aug 11, 2011 7:06 pm
by hmpaquito
Francisco Horta,

Creo que lo que puede estar pasando es que despues de la ACTION la clase TBtnBmp haga algo con el foco, de manera que aunque lo hubieras puesto bien en tu SetFocus(), la clase lo volveria a poner en el Boton... no estoy seguro que sea eso... pero me suena haber tenido ese problema.

En este tipo de cosas, es decir, asunto foco, muchas veces se hace inmanejable porque las propias clases fwh lo manejan, como no puede ser de otra forma. Lo que hago yo es forzar el foco con un Timer. Es un tanto hacking, pero se le pone un nombre (de funcion) y cuando alguien descubra como devolver a la vida a los criogenizados modificare la funcion de marras para hacerlo de una manera más ortodoxa. Lo puedes adaptar para que en vez de un oFocus, reciba un hFocus. Ahí va:

Code: Select all  Expand view

//-------------------------------------------------------------------------//
FUNCTION xSetFocus(oObj)
Local oTiempo
DEFINE TIMER oTiempo INTERVAL 10 OF oObj:oWnd ;
           ACTION (oObj:SetFocus(), oTiempo:Deactivate())
ACTIVATE TIMER oTiempo
RETURN NIL
*
 


Saludos

Re: cual control tuvo el foco

PostPosted: Thu Aug 11, 2011 7:28 pm
by Antonio Linares
Francisco,

Prueba a hacerlo asi:

aoBtn[3]:oJump := oControlQueTeniaElFoco

Re: cual control tuvo el foco

PostPosted: Thu Aug 11, 2011 7:38 pm
by Francisco Horta
Antonio, probando asi:

tratando de poner el foco directamente en un objeto, no funciona
REDEFINE BUTTONBMP aoBtn[3] ID 402 OF oDls BITMAP "MONITOS" TEXTRIGHT ;
ACTION ( Ocupantes(@cNom2,@cPat2,@cMat2,;
@cNom3,@cPat3,@cMat3,;
@cNom4,@cPat4,@cMat4,VAL(nPax)),;
aoBtn[3]:oJump := aoObjetos[5] )

y con el Handle tampoco
REDEFINE BUTTONBMP aoBtn[3] ID 402 OF oDls BITMAP "MONITOS" TEXTRIGHT ;
ACTION ( Ocupantes(@cNom2,@cPat2,@cMat2,;
@cNom3,@cPat3,@cMat3,;
@cNom4,@cPat4,@cMat4,VAL(nPax)),;
aoBtn[3]:oJump := nHandle )
aoBtn[3]:bGotFocus := {|oBtn,oOld| nHandle:=oOld}

el foco se sigue quedando en el boton
:-(
saludos
pak-o

Re: cual control tuvo el foco

PostPosted: Thu Aug 11, 2011 7:46 pm
by Francisco Horta
Antonio,

probando asi:
aoBtn[3]:oJump := aoObjetos[5] el foco se queda en el boton, pero si presiono TAB me devuelve al control que tenia el foco anteriormente

probando asi:
aoBtn[3]:oJump := nHandle el foco se queda en el boton, pero si presiono TAB manda este error:
Error description: Error BASE/1004 Class: 'NUMERIC' has no exported method: HWND
Called from: => HWND(0)
Called from: .\source\classes\CONTROL.PRG => TBUTTONBMP:FORWHEN(802)
Called from: .\source\classes\CONTROL.PRG => TBUTTONBMP:FWLOSTFOCUS(928)
Called from: .\source\classes\CONTROL.PRG => TBUTTON:HANDLEEVENT(1468)
Called from: .\source\classes\BUTTONB.PRG => TBUTTONBMP:HANDLEEVENT(189)
Called from: .\source\classes\WINDOW.PRG => _FWH(3409)
Called from: => DIALOGBOX(0)

saludos
pak-o

Re: cual control tuvo el foco

PostPosted: Thu Aug 11, 2011 7:57 pm
by Antonio Linares
Prueba asi:

aoBtn[3]:oJump := oWndFromHwnd( nHandle )

Re: cual control tuvo el foco

PostPosted: Thu Aug 11, 2011 8:26 pm
by Francisco Horta
Antonio,
probando, se queda el foco en el boton,,,
ya tambien hice todas las pruebas con y sin el tabstop cambiandolo desde el recurso y no funciona.
probe quitando el control buttonbmp y usando setkey(VK_FX,{||mifuncion}) y si funciona bien, pero la verdad se me vas estetico y presentable con un boton, sino tengo solucion pues usare setkey
gracias
pak-o

Re: cual control tuvo el foco

PostPosted: Fri Aug 12, 2011 7:22 am
by hmpaquito
Francisco Horta,

Me alegro que mi solucion te haya ayudado. Muchas gracias por mencionarlo y por el feedback. Seguiremos ayudando en todo lo posible.

Bye

Re: cual control tuvo el foco

PostPosted: Fri Aug 12, 2011 2:23 pm
by Francisco Horta
hmpaquito,
de nada, de hecho el timer lo deje como una ultima opcion, ya que en ese dialgo y otros utilizo timers para actualizaciones, y si funciona, pero el setkey es mas comodo unicamente poniendo una validacion dentro de mi funcion y va bien
saludos
pak-o