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

Post Reply
triumvirato
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

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

Post 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


#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!!!
Last edited by triumvirato on Thu Sep 23, 2010 11:16 am, edited 2 times in total.
User avatar
Pedro
Posts: 457
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

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

Post by Pedro »

Hola
He tomado tu ejemplo, lo he dejado así, y funciona

Code: Select all

#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
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
triumvirato
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

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

Post 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!
triumvirato
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

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

Post 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!
triumvirato
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

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

Post by triumvirato »

¿A nadie se le ocurre algo o es que el comportamiento es el esperado?. Estoy atascado con esto...

Gracias.
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

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

Post 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
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
triumvirato
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

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

Post 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!
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

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

Post 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 :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

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

Post by Antonio Linares »

David,

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

Code: Select all

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

Antonio Linares
www.fivetechsoft.com
triumvirato
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

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

Post 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!
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

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

Post 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 :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply