Tenia el requerimiento de ocultar o mostrar determinados controles de un dialogo; esto se lo puede hacer desde del código contenido en bWhen
Ejemplo:
- Code: Select all Expand view
local oCtrl1, oCtrl2, oCtrl3, nVar
:
oCtrl1:=TGet():New(..)
oCtrl1:bWhen:={|| if(nVar=1,oCtr1l:Show(),oCtrl1:Hide()), nVar=1 }
oCtrl2:=TGet():New(..)
oCtrl2:bWhen:={|| if(nVar=2,oCtrl2:Show(),oCtrl2:Hide()), nVar=2 }
oCtrl3:=TGet():New(..)
oCtrl3:bWhen:={|| if(nVar=3,oCtrl3:Show(),oCtrl3:Hide()), nVar=3 }
Sin embargo si son muchos controles, se tiene declarar una variable para cada objeto y el código se vuelve muy complicado.
Yo lo solucioné de la siguiente manera:
- Code: Select all Expand view
:
OVERRIDE METHOD lWhen IN CLASS TWindow WITH _lWhen
OVERRIDE METHOD AEvalWhen IN CLASS TWindow WITH _AEvalWhen
:
//----------------------------------------------------------------//
//usado en: EXTEND CLASS TWindow
static function _lWhen
LOCAL self := HB_QSelf()
Return If( self:bWhen != nil, Eval( self:bWhen, self ), .t. )
//----------------------------------------------------------------//
//usado en: EXTEND CLASS TWindow
static function _AEvalWhen
LOCAL self := HB_QSelf()
local n
local aControls := Self:aControls
if aControls != nil .and. ! Empty( aControls )
for n = 1 to Len( aControls )
if aControls[ n ] != nil .and. aControls[ n ]:bWhen != nil
if Eval( aControls[ n ]:bWhen, aControls[ n ] )
Self:aControls[ n ]:Enable() // keep this as Self:
else
Self:aControls[ n ]:Disable() // keep this as Self:
endif
endif
next
endif
return nil
En el código implementado se sobreescribe los metodos lWhen y AEvalWhen y en la implementacion se evalúa bWhen enviándole como parámetro el mismo objeto.
Y el código del dialogo queda así:
- Code: Select all Expand view
local nVar
:
TGet():New(....{|oCtrl| if(nVar=1,oCtrl:Show(),oCtrl:Hide()), nVar=1 }...)
TGet():New(....{|oCtrl| if(nVar=2,oCtrl:Show(),oCtrl:Hide()), nVar=2 }...)
TGet():New(....{|oCtrl| if(nVar=3,oCtrl:Show(),oCtrl:Hide()), nVar=3 }...)
:
Así el código queda mas claro y sencillo.
Esto se puede hacer en xharbour, pero seria ideal que fuera implementado directamente en la clase.
Ahora bien, entrando en el tema: ¿Que parámetros se debería pasar cuando se evalúa los distintos CODEBLOCK de las clases?
por ejemplo en la clase TButton() se tiene:
- Code: Select all Expand view
Eval( ::bAction, Self )
tal vez seria posible mejorar si se lo cambiara por
- Code: Select all Expand view
Eval( ::bAction, Self, ::oWnd )
En forma similar, talvez, se podría modificar varias clases donde se evalúa CODEBLOCKS con el paso de estos parametros que no afectan en nada.
Muchos CODEBLOCKS ya tiene sus parámetros definidos, que no deben ser modificados, para estos casos se debería pasar estos parámetros al final.
Buen tema para debatir verdad???
Atentamente,
Rolando.
Saludos desde Cochabamba, Bolivia.