Modifique un poquito la TGET. Antonio...

Modifique un poquito la TGET. Antonio...

Postby goosfancito » Thu Mar 22, 2007 9:39 pm

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]
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
User avatar
goosfancito
 
Posts: 1954
Joined: Fri Oct 07, 2005 7:08 pm

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

Postby wmormar » Fri Mar 23, 2007 1:27 am

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]
William, Morales
Saludos

méxico.sureste
User avatar
wmormar
 
Posts: 1074
Joined: Fri Oct 07, 2005 10:41 pm
Location: México

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

Postby goosfancito » Fri Mar 23, 2007 3:41 am

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 :)
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
User avatar
goosfancito
 
Posts: 1954
Joined: Fri Oct 07, 2005 7:08 pm

Postby Patricio Avalos Aguirre » Fri Mar 23, 2007 2:06 pm

Hola

Yo implementaria este metodo


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


Saludos
Patricio
User avatar
Patricio Avalos Aguirre
 
Posts: 1059
Joined: Fri Oct 07, 2005 1:56 pm
Location: La Serena, Chile

Postby goosfancito » Fri Mar 23, 2007 2:16 pm

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.
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
User avatar
goosfancito
 
Posts: 1954
Joined: Fri Oct 07, 2005 7:08 pm

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

Postby wmormar » Fri Mar 23, 2007 8:21 pm

Goos,

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

checa y verás.

jjejjejje
William, Morales
Saludos

méxico.sureste
User avatar
wmormar
 
Posts: 1074
Joined: Fri Oct 07, 2005 10:41 pm
Location: México

Postby pymsoft » Wed Jun 06, 2007 3:12 pm

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.
Pedro Gonzalez
User avatar
pymsoft
 
Posts: 383
Joined: Tue Oct 11, 2005 1:01 pm
Location: Savona - Italia

Postby Antonio Linares » Wed Jun 06, 2007 4:07 pm

Como indican Patricio y Pedro, se puede sencillamente consultar <Get>:oGet:changed
regards, saludos

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

Postby Maurilio Viana » Mon Jun 11, 2007 8:11 pm

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
User avatar
Maurilio Viana
 
Posts: 252
Joined: Tue Oct 25, 2005 2:48 pm
Location: Garça/Garza/Heron City - Brazil

Postby antolin » Sat Jun 16, 2007 11:35 am

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
antolin
 
Posts: 492
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Postby antolin » Sat Jun 16, 2007 12:07 pm

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.
antolin
 
Posts: 492
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 10 guests