Page 1 of 1

Modifique un poquito la TGET. Antonio...

PostPosted: Thu Mar 22, 2007 9:39 pm
by goosfancito
Antonio.

En estos casos de modificacion de las clases, como deberia de hacer para no incumplir con el reglamento?

Fundamento:
Hoy por hoy la clase no informa si el control tubo modificaciones, lo que hace es ejecutar un bloque de codigo cuando se hizo una modificacion, me refiero al bChange...

Pero la mayoria de las veces en mi trabajo a parte del bChange... utilizamos el bValid... en donde chequeamos si el control get ha cambiado su contenido para asi definir que hacemos al respecto...

Un ejemplo:


Code: Select all  Expand view
function main()

   local aCambio:= { .F., .F., .F., .F. }

   local oDatos:= array(4), ;
         vDatos:= array(4), ;
         oDlg


   vDatos[1]:= space(20)
   vDatos[2]:= space(20)
   vDatos[3]:= space(20)
   vDatos[4]:= space(20)   


   define dialog oDlg resource "DLG_DIALOGO"

      redefine get oDatos[1] var vDatos[1] id 100 of oDlg
      redefine get oDatos[2] var vDatos[2] id 101 of oDlg
      redefine get oDatos[3] var vDatos[3] id 102 of oDlg
      redefine get oDatos[4] var vDatos[4] id 103 of oDlg

      // Actualmente hacemos asi:

      oDatos[1]:bChanged:= { || aCambio[1]:= .t. }
      oDatos[2]:bChanged:= { || aCambio[2]:= .t. }
      oDatos[3]:bChanged:= { || aCambio[3]:= .t. }
      oDatos[41:bChanged:= { || aCambio[4]:= .t. }

      // Validamos ahora
      
      oDatos[1]:bValid:= { || ValidarDatos( oDatos ) }
      oDatos[2]:bValid:= { || ValidarDatos( oDatos ) }
      oDatos[3]:bValid:= { || ValidarDatos( oDatos ) }
      oDatos[4]:bValid:= { || ValidarDatos( oDatos ) }
   

   ACTIVATE DIALOG oDlg

return ( nil )

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

static function ValidarDatos( oDatos )

   if aCambio[1] .or. aCambio[2] .or. aCambio[3] .or. aCambio[4]
      
      // Aca se hace lo que uno quiere...
   endif

return ( nil )



Por lo vi una solucion mas "comoda" al momento de programar...
Y agregue dos lineas de codigo a la Tget

1) dentro de la definicion de la clase

Code: Select all  Expand view
    CLASS TGet FROM TControl

        ...

        DATA lCambio INIT .F.



2) Inicializar el lCambio cada vez que toma el foco el get..

Code: Select all  Expand view
METHOD GotFocus( hCtlLost ) CLASS TGet


        // Esta linea no me habia dado cuenta, gracias wmormar
        ::lCambio  := .f.    // wmormar   [20070322]



3) y luego en el método LostFocus agregue esto:

Code: Select all  Expand view
 

    METHOD LostFocus( hCtlFocus ) CLASS TGet

        ...

        if ! ::oGet:BadDate .and. ! ::lReadOnly .and. ;
         
          ( ::oGet:changed .or. ::oGet:unTransform() <> ::oGet:original )
            ::oGet:Assign()     // for adjust numbers
            ::oGet:UpdateBuffer()

          ::lCambio:= .T.   //  GoosFancito

          ....

   ENDIF


A partir de ahora, el mismo ejemplo queda de esta forma:

Code: Select all  Expand view
function main()

   local oDatos:= array(4), ;
         vDatos:= array(4), ;
         oDlg


   vDatos[1]:= space(20)
   vDatos[2]:= space(20)
   vDatos[3]:= space(20)
   vDatos[4]:= space(20)   


   define dialog oDlg resource "DLG_DIALOGO"

      redefine get oDatos[1] var vDatos[1] id 100 of oDlg
      redefine get oDatos[2] var vDatos[2] id 101 of oDlg
      redefine get oDatos[3] var vDatos[3] id 102 of oDlg
      redefine get oDatos[4] var vDatos[4] id 103 of oDlg

      // Validamos ahora
      
      oDatos[1]:bValid:= { || ValidarDatos( oDatos ) }
      oDatos[2]:bValid:= { || ValidarDatos( oDatos ) }
      oDatos[3]:bValid:= { || ValidarDatos( oDatos ) }
      oDatos[4]:bValid:= { || ValidarDatos( oDatos ) }
   

   ACTIVATE DIALOG oDlg

return ( nil )

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

static function ValidarDatos( oDatos )


   if oDatos[1]:lCambio .or. oDatos[2]:lCambio .or. oDatos[3]:lCambio .or. oDatos[4]:lCambio
      
      // Aca se hace lo que uno quiere...
   endif

   

return ( nil )



Espero que les sirva.[quote][/quote]

Re: Modifique un poquito la TGET. Antonio...

PostPosted: Fri Mar 23, 2007 1:27 am
by wmormar
Goos, yo haria lo siguiente:

Code: Select all  Expand view
function main()
   local oDatos:= array(4),vDatos:= array(4),oDlg

   vDatos[1]:= space(20)
   vDatos[2]:= space(20)
   vDatos[3]:= space(20)
   vDatos[4]:= space(20)   

   define dialog oDlg resource "DLG_DIALOGO"
      redefine get oDatos[1] var vDatos[1] id 100 of oDlg
      redefine get oDatos[2] var vDatos[2] id 101 of oDlg
      redefine get oDatos[3] var vDatos[3] id 102 of oDlg
      redefine get oDatos[4] var vDatos[4] id 103 of oDlg

      // Validamos ahora
      
      oDatos[1]:bValid:= { || alert("modifique GET 1") }
      oDatos[2]:bValid:= { || alert("modifique GET 2") }
      oDatos[3]:bValid:= { || alert("modifique GET 3") }
      oDatos[4]:bValid:= { || alert("modifique GET 4") }
   ACTIVATE DIALOG oDlg

return ( nil )


Bueno, es sugerencia, jjejjejjejje

[/code]

Re: Modifique un poquito la TGET. Antonio...

PostPosted: Fri Mar 23, 2007 3:41 am
by goosfancito
wmormar wrote:Goos, yo haria lo siguiente:

Code: Select all  Expand view
function main()
   local oDatos:= array(4),vDatos:= array(4),oDlg

   vDatos[1]:= space(20)
   vDatos[2]:= space(20)
   vDatos[3]:= space(20)
   vDatos[4]:= space(20)   

   define dialog oDlg resource "DLG_DIALOGO"
      redefine get oDatos[1] var vDatos[1] id 100 of oDlg
      redefine get oDatos[2] var vDatos[2] id 101 of oDlg
      redefine get oDatos[3] var vDatos[3] id 102 of oDlg
      redefine get oDatos[4] var vDatos[4] id 103 of oDlg

      // Validamos ahora
      
      oDatos[1]:bValid:= { || alert("modifique GET 1") }
      oDatos[2]:bValid:= { || alert("modifique GET 2") }
      oDatos[3]:bValid:= { || alert("modifique GET 3") }
      oDatos[4]:bValid:= { || alert("modifique GET 4") }
   ACTIVATE DIALOG oDlg

return ( nil )


Bueno, es sugerencia, jjejjejjejje

[/code]


perfecto, pero entonces deberia de modificarse el método o bValid o LostFous :)

PostPosted: Fri Mar 23, 2007 2:06 pm
by Patricio Avalos Aguirre
Hola

Yo implementaria este metodo


Code: Select all  Expand view
METHOD Ischange() INLINE ::oGet:Changed()


Saludos
Patricio

PostPosted: Fri Mar 23, 2007 2:16 pm
by goosfancito
Patricio Avalos Aguirre wrote:Hola

Yo implementaria este metodo


Code: Select all  Expand view
METHOD Ischange() INLINE ::oGet:Changed()


Saludos
Patricio


Cual sería la ventaja?

Gracias.

Re: Modifique un poquito la TGET. Antonio...

PostPosted: Fri Mar 23, 2007 8:21 pm
by wmormar
Goos,

exactamente como está la modificación funciona de maravillas.

checa y verás.

jjejjejje

PostPosted: Wed Jun 06, 2007 3:12 pm
by pymsoft
Me encontrè con el mismo problema, pero lo resolví asi:

Code: Select all  Expand view
    REDEFINE GET oG[4] VAR cPosiz  ID 103 OF oDlg PICTURE "@!"  VALID ( IIF( oG[4]:oGet:changed, msginfo("modificado"),  msginfo("no modificado") ), .T. )


Saludos.

PostPosted: Wed Jun 06, 2007 4:07 pm
by Antonio Linares
Como indican Patricio y Pedro, se puede sencillamente consultar <Get>:oGet:changed

PostPosted: Mon Jun 11, 2007 8:11 pm
by Maurilio Viana
Como lo dice Patricio, pero yo solo cambiaria el nomble del metodo:

Code: Select all  Expand view
METHOD Ischange() INLINE ::oGet:Changed()


a

Code: Select all  Expand view
METHOD lChanged() INLINE ::oGet:Changed()


Jejeje, de IsChange a lChanged...

Saludos!
Maurilio

PostPosted: Sat Jun 16, 2007 11:35 am
by antolin
Yo lo que hago lo tomé de un buen amigo mio:

DATA OldDat
DATA lCambio AS LOGICAL INIT .F.

METHOD GotFocus( hCtlLost ) CLASS TGet
...
::OldDat := ::VarGet()
...


METHOD lValid() CLASS TGet
...
::lCambio := !(::OldDat==::VarGet()) .OR. ::lCambio
...

Tiene el inconveniente de una variable más (::OldDat) pero si tras cambiar el contenido del GET, te arrepientes y vuelves a escribir lo que había, tu ::lCambio seguirá estando en .T. cuando debería volver a .F. como el contenido del Get.

Como sugerencia, además de esto utilizo (en el mismo método lValid()):

local xGet := ::VarGet()
::lBlank := (xGet = NIL .OR. Empty(xGet))

(un nuevo DATA booleano = 1 bit -> ::lBlank )

Saludos

PostPosted: Sat Jun 16, 2007 12:07 pm
by antolin
Se me olvidaba. Hay que reponer ::lCambio a .F.
Eso lo hago en el mismo método lValid

ELSEIF ValType( ::bValid ) == "B" .AND. ( ::lCambio .OR. ::lValida )
lRet := Eval( ::bValid, Self )
::lCambio := .F.

Como verá, solo se evalúa el VALID si hubo ::lCambio.

Perdon por el lapsus.