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

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

Postby triumvirato » Mon Sep 20, 2010 10:58 am

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!!!
Last edited by triumvirato on Thu Sep 23, 2010 11:16 am, edited 2 times in total.
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

Postby Pedro » Mon Sep 20, 2010 11:39 am

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
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
User avatar
Pedro
 
Posts: 464
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

Postby triumvirato » Mon Sep 20, 2010 11:48 am

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

Postby triumvirato » Mon Sep 20, 2010 2:56 pm

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

Postby triumvirato » Wed Sep 22, 2010 8:39 am

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

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

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

Postby FranciscoA » Wed Sep 22, 2010 1:20 pm

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.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2132
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

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

Postby triumvirato » Thu Sep 23, 2010 6:37 am

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

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

Postby Antonio Linares » Thu Sep 23, 2010 7:29 am

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: 41462
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

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

Postby Antonio Linares » Sat Sep 25, 2010 7:53 am

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
 
regards, saludos

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

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

Postby triumvirato » Sat Sep 25, 2010 8:20 am

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

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

Postby Antonio Linares » Sat Sep 25, 2010 9:18 am

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


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 137 guests