FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Antonio, problema en Get, cláusulas WHEN y CANCEL
Posts: 199
Joined: Tue Apr 22, 2008 09:54 AM
Antonio, problema en Get, cláusulas WHEN y CANCEL
Posted: 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 (fw): Select all Collapse
#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!!!
Posts: 464
Joined: Tue Mar 21, 2006 07:30 PM
Re: Comportamiento anómalo en Get con cláusulas WHEN y CANCEL
Posted: Mon Sep 20, 2010 11:39 AM
Hola
He tomado tu ejemplo, lo he dejado así, y funciona
Code (fw): Select all Collapse
#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
Posts: 199
Joined: Tue Apr 22, 2008 09:54 AM
Re: Comportamiento anómalo en Get con cláusulas WHEN y CANCEL
Posted: 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!

Posts: 199
Joined: Tue Apr 22, 2008 09:54 AM
Re: Comportamiento anómalo en Get con cláusulas WHEN y CANCEL
Posted: Mon Sep 20, 2010 02: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!

Posts: 199
Joined: Tue Apr 22, 2008 09:54 AM
Re: Antonio, problema en Get, cláusulas WHEN y CANCEL
Posted: Wed Sep 22, 2010 08:39 AM

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

Gracias.

Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Antonio, problema en Get, cláusulas WHEN y CANCEL
Posted: Wed Sep 22, 2010 01: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
Posts: 199
Joined: Tue Apr 22, 2008 09:54 AM
Re: Antonio, problema en Get, cláusulas WHEN y CANCEL
Posted: Thu Sep 23, 2010 06: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!

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Antonio, problema en Get, cláusulas WHEN y CANCEL
Posted: Thu Sep 23, 2010 07: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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Antonio, problema en Get, cláusulas WHEN y CANCEL
Posted: Sat Sep 25, 2010 07:53 AM
David,

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

Code (fw): Select all Collapse
   @ 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
Posts: 199
Joined: Tue Apr 22, 2008 09:54 AM
Re: Antonio, problema en Get, cláusulas WHEN y CANCEL
Posted: Sat Sep 25, 2010 08: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!

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Antonio, problema en Get, cláusulas WHEN y CANCEL
Posted: Sat Sep 25, 2010 09: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

Continue the discussion