Page 1 of 1

Modifique un poquito la TGET. Antonio...

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

En _ 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

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

    CLASS TGet FROM TControl

        ...

        DATA lCambio INIT .F. 

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

Code: Select all

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

  

    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

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...

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

Code: Select all

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...

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

Code: Select all

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 :)

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

Yo implementaria este metodo

Code: Select all

METHOD Ischange() INLINE ::oGet:Changed()
Saludos
Patricio

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

Yo implementaria este metodo

Code: Select all

METHOD Ischange() INLINE ::oGet:Changed()
Saludos
Patricio
Cual sería la ventaja?

Gracias.

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

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

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

checa y verás.

jjejjejje

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

Code: Select all

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

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

Posted: 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

METHOD Ischange() INLINE ::oGet:Changed()
a

Code: Select all

METHOD lChanged() INLINE ::oGet:Changed()
Jejeje, de IsChange a lChanged...

Saludos!
Maurilio

Posted: 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

Posted: 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.