Page 1 of 1

ON CHANGE de GET active BUTTON

Posted: Thu Apr 30, 2009 2:44 pm
by fusion
Saludos,

Tengo la siguiente situacion...
LOCA cId:= SPAC(10), cPassword:= SPAC(10)...

@ 74,180 GET cId PIXEL ON CHANGE oBtn:Refresh()
@ 85,180 GET cPassword PASSWORD PIXEL ON CHANGE oBtn:Refresh()
@ 102, 85 BUTTON oBtn PROMPT '&Ingresar' WHEN ( !EMPTY( cId ) .AND. !EMPTY( cPassword ) ) ACTION ( ValidInfo( cId, cPassword ) )
...

Sucede que el boton oBtn inicia desactivado porque cId y cPassword estan vacios, pero se escribe en cId y se empieza a escribir en cPassword y no he podido hacer que se active o desactive oBtn a medida que va cambiando cPassword o cId, he probado cambiando el ON CHANGE de los GET por ( oBtn:Refresh(), .T. ), ( oDlg:Refresh(), .T. ), ( SysRefresh(), .T. ), etc... y nada.... solo se activa oBtn cuando el GET bien sea de cId o cPassword pierden el foco, por lo tanto mi consulta es...

QUE DEBO PONER EN EL ON CHANGE DEL GET PARA QUE VAYA ACTUALIZANDO LA INFORMACION DEL BUTTON ?

Gracias por sus aportes...

Re: ON CHANGE de GET active BUTTON

Posted: Thu Apr 30, 2009 3:43 pm
by vlmsoft
Hola Jair,

Prueba con oBtn:Enable().

En el siguiente ejemplo se activa el boton cuando se ha validado el password:

.....
@ 74,180 GET cID PIXEL VALID TuFuncionValidID(...)
@ 85,180 GET cPassword PIXEL VALID IF( TuFuncionValidPassword(...),oBtn:Enable(),MsgInfo("Error en password") )
.....

Un saludo.

Re: ON CHANGE de GET active BUTTON

Posted: Thu Apr 30, 2009 4:57 pm
by fusion
Gracias por tu aporte,

efectivamente el oBtn:enable() activa el boton, pero no es la idea a la que quiero llegar...

Imagina que tienes un GET en el que el usuario va escribiendo y necesitas que un boton, un say, o cualquier control muestre, actue, se active, etc... en medida de _ que vayan sucediendo en el get sin abandonarlo...

Hay algo que sucede cuando el GET pierde el foco, que evalua el WHEN del boton y lo activa, ese algo es lo que quiero hacer para activar el boton del ejemplo...

(He estado probando algo con oBtn:aEvalWhen(), oDlg:aEvalWhen(), pero aun no he podido) seguire intentando y esperando sus aportes

Gracias de nuevo,

Re: ON CHANGE de GET active BUTTON

Posted: Thu Apr 30, 2009 5:34 pm
by Willi Quintana
Hazlo asi:
REDEFINE BTNGET oBusGlob ;
VAR cBusGlob ;
ON CHANGE (oBusGlob:Assign(), ; // actualiza el buffer a la variable propia
EVAL(XXX), oBotonx:Enable(), oNoseQue:Show()........... ) // lego del Assign pones lo que desees o evaluas el valor de la variable....

Salu2

Re: ON CHANGE de GET active BUTTON

Posted: Thu Apr 30, 2009 5:38 pm
by Willi Quintana
O tomando tu ejemplo

oBtn:Disable()
@ 74,180 GET cId PIXEL ON CHANGE (oBtn:Assign(), oBtn:Enable(), oBtn:Refresh() )
@ 85,180 GET cPassword PASSWORD PIXEL ON CHANGE (oBtn:Assign(), oBtn:Enable(), oBtn:Refresh() )
@ 102, 85 BUTTON oBtn PROMPT '&Ingresar' WHEN ( !EMPTY( cId ) .AND. !EMPTY( cPassword ) ) ACTION ( ValidInfo( cId, cPassword ) )
...

Salu2

Re: ON CHANGE de GET active BUTTON

Posted: Thu Apr 30, 2009 6:20 pm
by fusion
Saludos Willy y muchas gracias por tu contribucion...

Pero lamento decirte que no existe el metodo que mencionas para los botones... oBtn:Assign() me salio el error (Error description: Warning BASE/1004 Message not found: TBUTTON:ASSIGN)

He estado probando con...

@ 85,180 GET cPassword OF oDlg PIXEL PASSWORD ON CHANGE ( oBtn:aEvalWhen(), oDlg:aEvalWhen(), UpdateWindow(), MsgInfo( 'Probando' ) )

funciona, siempre y cuando no le quite el MsgInfo(), y lo otro que tiene malo es que activa el boton al digitar el segundo caracter, y si el usuario borra con la tecla Retroceder [BackSpace], cuando borra el primer caracter sigue activo el boton, tienen que presionar otro Retroceder para que vuelva a inactivarse el boton...

Bueno, seguire investigando y en espera de sus aportes.

Gracias de nuevo

Re: ON CHANGE de GET active BUTTON

Posted: Thu Apr 30, 2009 7:02 pm
by QAZWSX2K
YO QUE TU LE QUITARA ENTONCES EL MSGINFO Y LE PUSIERA UN SYSREFRESH()

Re: ON CHANGE de GET active BUTTON

Posted: Thu Apr 30, 2009 7:55 pm
by ADBLANCO
prueba con:

oDlg:AEvalWhen() // evaluar los when en un dialogo

Re: ON CHANGE de GET active BUTTON

Posted: Thu Apr 30, 2009 7:56 pm
by Willi Quintana
UPs,, tienes razon,,, deberia ir asi:

oBtn:Disable()
@ 74,180 GET oGetx VAR cId PIXEL
@ 85,180 GET oPass VAR cPassword PASSWORD PIXEL ON CHANGE (oPass:Assign(), If(cld = xxx .AND. cPasword = yyy, oBtn:Enable(), oBtn:DIsable()), oBtn:Refresh() )
@ 102, 85 BUTTON oBtn PROMPT '&Ingresar' WHEN ( !EMPTY( cId ) .AND. !EMPTY( cPassword ) ) ACTION ( ValidInfo( cId, cPassword ) )

esto activaria el boton "ingresar" si se cumple la igualdad de las variables con xxx y con yyy

Salu2

Re: ON CHANGE de GET active BUTTON

Posted: Thu Apr 30, 2009 8:08 pm
by fusion
QAZWSX2K wrote:YO QUE TU LE QUITARA ENTONCES EL MSGINFO Y LE PUSIERA UN SYSREFRESH()
Ya lo habia probado de esta manera y no funciona... (Con SysRefresh() )

@ 85,180 GET cPassword OF oDlg PIXEL PASSWORD ON CHANGE ( oBtn:aEvalWhen(), oDlg:aEvalWhen(), SysRefresh() )

Pero si lo hago de esta manera...

@ 85,180 GET cPassword OF oDlg PIXEL PASSWORD ON CHANGE ( oBtn:aEvalWhen(), oDlg:aEvalWhen(), SysRefresh(), MsgInfo( ''Probando ) )

le pongo el MsgInfo() para verificar que se esta ejecutando el ON CHANGE, eso causa una salida y entrada al GET y ahi si actualiza el estado del boton... osea evalua oBtn:aEvalWhen() y oDlg:aEvalWhen()...

Gracias... y sigo probando y en espera de sugerencias...

Re: ON CHANGE de GET active BUTTON

Posted: Thu Apr 30, 2009 8:14 pm
by fusion
ADBLANCO wrote:prueba con:

oDlg:AEvalWhen() // evaluar los when en un dialogo
Gracias por tu aporte, pero ya lo habia probado... el ultimo codigo que puse que funciona con problemas es...

@ 85,180 GET cPassword OF oDlg PIXEL PASSWORD ON CHANGE ( oBtn:aEvalWhen(), oDlg:aEvalWhen(), UpdateWindow(), MsgInfo( 'Probando' ) )

El UpdateWindow() lo he cambiado por SysRefresh() y no trabaja sino pongo el MsgInfo() de prueba para verificar la ejecucion del ON CHANGE del GET...

Ojala Antonio nos de una manito...

Gracias...

Re: ON CHANGE de GET active BUTTON

Posted: Fri May 01, 2009 2:43 am
by Daniel Garcia-Gil
Saludos...

Si logro entender tu problema, puedes intentar esto

Code: Select all

#include "fivewin.ch"

function main()
  local oDlg
  local cId := space( 10 )
  local cPass := space( 10 )
  local oBtn
   
  define dialog oDlg pixel size 400,400
  
  @ 01,01 Get oGetx var cId pixel of oDlg
  @ 20,01 Get oGetP var cPass Password pixel of oDlg ;
  on change( if( empty( oGetP:oGet:Buffer ), oBtn:Disable(), oBtn:Enable() ) )
  @ 40,01 button oBtn prompt "OK" of oDlg pixel
  
  oBtn:Disable()
  
  activate dialog oDlg
 
return nil