BUG en TRadMenu ( Radmenu.prg ) y FIX
Posted: Thu Feb 04, 2010 7:28 pm
Buenas,
Bueno al parecer toda la vida de fivewin existio este bug y nadie se ha dado cuenta , el tema es que cuando se deshabilita via clausula bWhen algun Item de un RADIO, el sistema a traves de las teclas GO_DOW/GO_UP sigue moviendose encima de un item deshabilitado. La solucion que encontre es la siguiente:
REDEFINE RADIO oRadio ID 101,102,103 .....
supongamos que la opcion 2, en tiempo de ejecucion la debo deshailitar, entonces asigno al item
oRadio:aItems[2]:bWhen:= {|| .F.}
oRadio:Refresh()
Esto funcionaba bien, es decir, deshabilita la opcion 2 y quedan activas la 1 y 3, PERO aun se sigue seleccionado la 2 a traves de las teclas VK_DOWN O VK_UP, cuando hacen la llamada en el KeyDown de algun item.
SOLUCION:
Modificar 2 metodos:
Crear un Metodo
Un Abrazo a todos.
Bueno al parecer toda la vida de fivewin existio este bug y nadie se ha dado cuenta , el tema es que cuando se deshabilita via clausula bWhen algun Item de un RADIO, el sistema a traves de las teclas GO_DOW/GO_UP sigue moviendose encima de un item deshabilitado. La solucion que encontre es la siguiente:
REDEFINE RADIO oRadio ID 101,102,103 .....
supongamos que la opcion 2, en tiempo de ejecucion la debo deshailitar, entonces asigno al item
oRadio:aItems[2]:bWhen:= {|| .F.}
oRadio:Refresh()
Esto funcionaba bien, es decir, deshabilita la opcion 2 y quedan activas la 1 y 3, PERO aun se sigue seleccionado la 2 a traves de las teclas VK_DOWN O VK_UP, cuando hacen la llamada en el KeyDown de algun item.
SOLUCION:
Modificar 2 metodos:
Code: Select all
METHOD GoPrevNext( lNext ) // Hernan 04/02/2010
METHOD GoPrev() INLINE ::GoPrevNext( .F. )
// ::SetOption( If( ::nOption == 1, Len( ::aItems ), ::nOption - 1 ) )
METHOD GoNext() INLINE ::GoPrevNext( .T. )
// ::SetOption( If( ::nOption == Len( ::aItems ), 1, ::nOption + 1 ) )
Code: Select all
METHOD GoPrevNext( lNext ) CLASS TRadMenu
local nMove:= 0
local nOption:= ::nOption
DEFAULT lNext:= .F.
while !( nMove > Len( ::aItems ) )
nMove++
if lNext
nOption++
nOption:= if( nOption > Len(::aItems), 1, nOption )
else
nOption--
nOption:= if( nOption < 1, Len(::aItems), nOption )
endif
if ::aItems[nOption]:lWhen()
::nOption:= nOption
exit
endif
enddo
if nOption <> ::nOption
::SetOption( nOption )
endif
return Self
Un Abrazo a todos.