Page 1 of 1
Antonio, problema en Get, cláusulas WHEN y CANCEL
Posted: 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
#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
Posted: Mon Sep 20, 2010 11:39 am
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
Re: Comportamiento anómalo en Get con cláusulas WHEN y CANCEL
Posted: 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
Posted: 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
Posted: 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
Posted: 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
Posted: 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
Posted: 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
Posted: Sat Sep 25, 2010 7:53 am
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
Re: Antonio, problema en Get, cláusulas WHEN y CANCEL
Posted: 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
Posted: 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