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]