Modifique un poquito la TGET. Antonio...

Post Reply
User avatar
goosfancito
Posts: 1392
Joined: Fri Oct 07, 2005 7:08 pm

Modifique un poquito la TGET. Antonio...

Post 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]
Un aporte chico hace grandes cambios.
Apoyemos al proyecto "Hogar pimpinela"
Bajate la aplicación (gratuita) y encuentra en ella toda la info de como podes colaborar.
GRACIAS!
https://play.google.com/store/apps/deta ... .acomprar
User avatar
wmormar
Posts: 1050
Joined: Fri Oct 07, 2005 10:41 pm
Location: México
Contact:

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

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

méxico.sureste
User avatar
goosfancito
Posts: 1392
Joined: Fri Oct 07, 2005 7:08 pm

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

Post 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 :)
Un aporte chico hace grandes cambios.
Apoyemos al proyecto "Hogar pimpinela"
Bajate la aplicación (gratuita) y encuentra en ella toda la info de como podes colaborar.
GRACIAS!
https://play.google.com/store/apps/deta ... .acomprar
User avatar
Patricio Avalos Aguirre
Posts: 1028
Joined: Fri Oct 07, 2005 1:56 pm
Location: La Serena, Chile
Contact:

Post by Patricio Avalos Aguirre »

Hola

Yo implementaria este metodo

Code: Select all

METHOD Ischange() INLINE ::oGet:Changed()
Saludos
Patricio
User avatar
goosfancito
Posts: 1392
Joined: Fri Oct 07, 2005 7:08 pm

Post 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.
Un aporte chico hace grandes cambios.
Apoyemos al proyecto "Hogar pimpinela"
Bajate la aplicación (gratuita) y encuentra en ella toda la info de como podes colaborar.
GRACIAS!
https://play.google.com/store/apps/deta ... .acomprar
User avatar
wmormar
Posts: 1050
Joined: Fri Oct 07, 2005 10:41 pm
Location: México
Contact:

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

Post by wmormar »

Goos,

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

checa y verás.

jjejjejje
William, Morales
Saludos

méxico.sureste
User avatar
pymsoft
Posts: 383
Joined: Tue Oct 11, 2005 1:01 pm
Location: Savona - Italia
Contact:

Post 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.
Pedro Gonzalez
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

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

Antonio Linares
www.fivetechsoft.com
User avatar
Maurilio Viana
Posts: 252
Joined: Tue Oct 25, 2005 2:48 pm
Location: Garça/Garza/Heron City - Brazil
Contact:

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

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

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