FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Modifique un poquito la TGET. Antonio...
Posts: 1956
Joined: Fri Oct 07, 2005 07:08 PM
Modifique un poquito la TGET. Antonio...
Posted: Thu Mar 22, 2007 09: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:


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

    CLASS TGet FROM TControl

        ...

        DATA lCambio INIT .F.


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

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:

  

    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:

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.
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
Posts: 1076
Joined: Fri Oct 07, 2005 10:41 PM
Re: Modifique un poquito la TGET. Antonio...
Posted: Fri Mar 23, 2007 01:27 AM
Goos, yo haria lo siguiente:

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
Posts: 1956
Joined: Fri Oct 07, 2005 07:08 PM
Re: Modifique un poquito la TGET. Antonio...
Posted: Fri Mar 23, 2007 03:41 AM
wmormar wrote:Goos, yo haria lo siguiente:

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/
Posts: 1074
Joined: Fri Oct 07, 2005 01:56 PM
Modifique un poquito la TGET. Antonio...
Posted: Fri Mar 23, 2007 02:06 PM
Hola

Yo implementaria este metodo


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


Saludos
Patricio
Saludos
Patricio

__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
Posts: 1956
Joined: Fri Oct 07, 2005 07:08 PM
Modifique un poquito la TGET. Antonio...
Posted: Fri Mar 23, 2007 02:16 PM
Patricio Avalos Aguirre wrote:Hola

Yo implementaria este metodo


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/
Posts: 1076
Joined: Fri Oct 07, 2005 10:41 PM
Re: Modifique un poquito la TGET. Antonio...
Posted: Fri Mar 23, 2007 08:21 PM

Goos,

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

checa y verás.

jjejjejje

William, Morales

Saludos



méxico.sureste
Posts: 383
Joined: Tue Oct 11, 2005 01:01 PM
Modifique un poquito la TGET. Antonio...
Posted: Wed Jun 06, 2007 03:12 PM
Me encontrè con el mismo problema, pero lo resolví asi:

    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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Modifique un poquito la TGET. Antonio...
Posted: Wed Jun 06, 2007 04:07 PM

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

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 252
Joined: Tue Oct 25, 2005 02:48 PM
Modifique un poquito la TGET. Antonio...
Posted: Mon Jun 11, 2007 08:11 PM
Como lo dice Patricio, pero yo solo cambiaria el nomble del metodo:

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


a

METHOD lChanged() INLINE ::oGet:Changed()


Jejeje, de IsChange a lChanged...

Saludos!
Maurilio
Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Modifique un poquito la TGET. Antonio...
Posted: 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

Peaaaaaso de foro...

FWH 2007 - xHarbour - BCC55
Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Modifique un poquito la TGET. Antonio...
Posted: 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.
Peaaaaaso de foro...

FWH 2007 - xHarbour - BCC55

Continue the discussion