Page 1 of 1

Antonio, problema en Get, cláusulas WHEN y CANCEL

PostPosted: Mon Sep 20, 2010 10:58 am
by triumvirato
Hola compañeros,

Tengo un problema que no consigo darle solución:
Al pulsar el botón Desactivar, deberían quedar desactivados el propio botón desactivar, el Get y activado el botón Activar. Sin embargo, no sucede en la forma que debería. Si suprimimos la cláusula VALID del Get y la cláusula CANCEL del botón Desactivar, obtenemos el comportamiento deseado. ¿Alguna Sugerencia?
Dejo un ejemplo con el problema:

Code: Select all  Expand view


#include "FiveWin.ch"

//----------------------------------------------------------------------------//

function Main()

   local oDlg
   local cName1 := "             "
   local lEdit := .t.
   
   DEFINE DIALOG oDlg FROM 1, 5 TO 40, 100 TITLE "Hello World!"
   
   @  05,  18 GET cName1  OF oDlg WHEN lEdit COLORS "B/BG" UPDATE VALID !Empty( cName1 )
   
   @ 1, 1 BUTTON oBtn PROMPT "Desactivar" SIZE 50, 30 OF oDlg WHEN lEdit ACTION lEdit := .f. CANCEL
   @ 3, 1 BUTTON oBtn1 PROMPT "Activar" SIZE 50, 30 OF oDlg WHEN !lEdit ACTION lEdit := .t.

   ACTIVATE DIALOG oDlg CENTERED

return nil
 


Muchas gracias, Saludos!!!

Re: Comportamiento anómalo en Get con cláusulas WHEN y CANCEL

PostPosted: Mon Sep 20, 2010 11:39 am
by Pedro
Hola
He tomado tu ejemplo, lo he dejado así, y funciona
Code: Select all  Expand view

#include "FiveWin.ch"

//----------------------------------------------------------------------------//

function Main()

   local oDlg
   local cName1 := Space(25)
   local lEdit
   
   DEFINE DIALOG oDlg FROM 1, 5 TO 40, 100 TITLE "Hello World!"
   
   @  05,  18 GET cName1  WHEN lEdit VALID !Empty( cName1 ) COLORS "B/BG"  OF oDlg UPDATE  
   
   @ 3, 1 BUTTON oBtn PROMPT "Desactivar" SIZE 50, 30 OF oDlg;
          WHEN lEdit ACTION (lEdit := .f.,;
                             oBtn1:Refresh(),;
                             oBtn:Refresh(),;
                             oDlg:Update())       // CANCEL
   @ 1, 1 BUTTON oBtn1 PROMPT "Activar" SIZE 50, 30 OF oDlg ;
          WHEN !lEdit ACTION (lEdit := .t.,;
                              oBtn:Refresh(),;
                              oBtn1:Refresh(),;
                              Odlg:Update())
   
   
   ACTIVATE DIALOG oDlg CENTERED ON INIT lEdit := .F.

return nil

Re: Comportamiento anómalo en Get con cláusulas WHEN y CANCEL

PostPosted: Mon Sep 20, 2010 11:48 am
by triumvirato
Pedro,

Gracias por tu ayuda.

Si eliminamos la cláusula CANCEL (que es la que permite saltarse el VALID del Get), Al situarte en el Get, no puedes pinchar sobre el botón Desactivar. La cláusula CANCEL es necesaria 100%.
En mi código había hecho alguna prueba con los Refresh y Updates, el problema está en que tampoco corrigen el problema, además de que el código tiene más de 200 controles (entre browses, gets, botones, etc.) por lo que ir actualizando uno a uno es realmente complicado. Por la misma razón no utilizo los métodos de cada clase :Enable() y :Disable(). Creo que el problema es un funcionamiento extraño de la cláusula CANCEL. A ver si alguien nos saca de dudas y consigue que funcione correctamente si es que el comportamiento no es el esperado.

Saludos!

Re: Comportamiento anómalo en Get con cláusulas WHEN y CANCEL

PostPosted: Mon Sep 20, 2010 2:56 pm
by triumvirato
Francisco, (HA DESAPARECIDO TU POST)

Muchas gracias por tu ayuda. Si lo hago de esta manera, al tener unos 200 controles que actualizar en el diálogo como decía antes, necesito incluir unas 199 cláusulas Enable() y otras 199 cláusulas Disable(). En el ejemplo se usa un GET y dos botones, en mi código son unos 200 controles a actualizar entre GETS, BROWSES, SAYS, ETC., cuando el problema que veo es un comportamiento anormal cuando un botón tiene la cláusula CANCEL. Por cierto, si lo hago de esta manera que indicas, me sobran entonces todas las cláusulas WHEN de los controles.

Antonio, ¿es correcto este comportamiento cuando se pone la cláusula CANCEL?
Saludos!

Re: Antonio, problema en Get, cláusulas WHEN y CANCEL

PostPosted: Wed Sep 22, 2010 8:39 am
by triumvirato
¿A nadie se le ocurre algo o es que el comportamiento es el esperado?. Estoy atascado con esto...

Gracias.

Re: Antonio, problema en Get, cláusulas WHEN y CANCEL

PostPosted: Wed Sep 22, 2010 1:20 pm
by FranciscoA
Triunvirato, esto lo hice al vuelo (es solo un ejemplo, no lo he probado):

Function Des_Act_Ctrls(oDlg, lActivar)
local aCtrls, n

aCtrls:=oDlg:aControls

if !lActivar //desactivar

For n:= 1 to len(aCtrls)
if aCtrls[n]:ClassName() ="TBUTTON" .or. aCtrls[n]:ClassName() = "TGET"
if oDlg:aControls[n]:ClassName() = "TGET"
oDlg:aControls[n]:Disable()
endif

if oDlg:aControls[n]:ClassName() ="TBUTTON" .and. oDlg:aControls[n]:cText = "ACTIVAR" //queda activo este bot
oDlg:aControls[n]:Enable()
else //desactivar resto de botones
oDlg:aControls[n]:Disable()
endif
endif
Next

else //Activar

For n:= 1 to len(aCtrls)
if aCtrls[n]:ClassName() ="TBUTTON" .or. aCtrls[n]:ClassName() = "TGET"
if oDlg:aControls[n]:ClassName() = "TGET"
oDlg:aControls[n]:Enable()
endif

if oDlg:aControls[n]:ClassName() ="TBUTTON" .and. oDlg:aControls[n]:cText = "ACTIVAR" //queda act este bot
oDlg:aControls[n]:Disable()
else //resto de botones quedan activos
oDlg:aControls[n]:Enable()
endif
endif
Next

endif

Saludos

Re: Antonio, problema en Get, cláusulas WHEN y CANCEL

PostPosted: Thu Sep 23, 2010 6:37 am
by triumvirato
Francisco,

Gracias por tu ayuda.
Estoy probando el trocito de código que has propuesto. Me ha abierto los ojos para muchas cosas, es muy interesante (de hecho ya le he dado uso en otras partes de mi código), pero para este caso concreto no me sirve, pues los controles que han de funcionar son unos 200, pero en ese mismo diálogo hay otros tantos que no. Por tanto me quedan o todos activados o desactivados (incluidos los que no hay que hacer nada con ellos).

A ver si Antonio pasa por aquí y nos puede decir algo sobre el comportamiento de ese CANCEL.

GRACIAS!

Re: Antonio, problema en Get, cláusulas WHEN y CANCEL

PostPosted: Thu Sep 23, 2010 7:29 am
by Antonio Linares
David,

Todos los controles estan contenidos en oDlg:aControls por lo que puedes hacer:

AEval( oDlg:aControls, { | oControl | oControl:Enable() } )

ó lo que necesites :-)

Re: Antonio, problema en Get, cláusulas WHEN y CANCEL

PostPosted: Sat Sep 25, 2010 7:53 am
by Antonio Linares
David,

Con este pequeño cambio, tu ejemplo funciona como deseas :-)

Code: Select all  Expand view

   @ 1, 1 BUTTON oBtn PROMPT "Desactivar" SIZE 50, 30 OF oDlg WHEN lEdit ;
      ACTION ( lEdit := .f., oDlg:AEvalWhen() ) CANCEL
 

Re: Antonio, problema en Get, cláusulas WHEN y CANCEL

PostPosted: Sat Sep 25, 2010 8:20 am
by triumvirato
Antonio,

Gracias, de verdad muchas gracias, funcionó perfectamente, ese era el comportamiento que yo esperaba e imaginaba que haría automáticamente.

Muchas gracias, Saludos!

Re: Antonio, problema en Get, cláusulas WHEN y CANCEL

PostPosted: Sat Sep 25, 2010 9:18 am
by Antonio Linares
bien! :-)

Las evaluaciones de los WHEN solo se realizan en las pérdidas de foco es por esto que hay que llamar a oDlg:AEvalWhen() para forzar que se realice :-)