Hola amigos del foro:
Hace tiempo que uso el DBCombo, pero recien me di cuenta que no funciona bien el autoserch. Despues de leer varios post del foro me puse a analizar el codigo fuente DBCombo.prg y ComboBox.prg.
Ahi vi que:
1. cSearchKey esta definida en ambos prg, creo que no deberia estar en DBCombo.prg
2. En el metodo KeyChar(..) de DBCombo.prg se debe colocar RETURN 0 una vez que se a encontrado un nuevo item y evaluado bChange, si no se hace esto DBCombo ejecuta Super:KeyChar(nKey, nFlags) y ahi se ejecuta otra busqueda que cambia de nuevo la posicion del DBCombo.
Mi version de FWH es 8.02 y el codigo corregido en concreto seria:
Con esta correccion corre bien el DBCombo .
Saludos
Rolando
Sauro Srl.
Informática y Sistemas
Cochabamba - Bolivia
FWH 8.02 xharbour 1.1.0 (SimpLex)
Hace tiempo que uso el DBCombo, pero recien me di cuenta que no funciona bien el autoserch. Despues de leer varios post del foro me puse a analizar el codigo fuente DBCombo.prg y ComboBox.prg.
Ahi vi que:
1. cSearchKey esta definida en ambos prg, creo que no deberia estar en DBCombo.prg
2. En el metodo KeyChar(..) de DBCombo.prg se debe colocar RETURN 0 una vez que se a encontrado un nuevo item y evaluado bChange, si no se hace esto DBCombo ejecuta Super:KeyChar(nKey, nFlags) y ahi se ejecuta otra busqueda que cambia de nuevo la posicion del DBCombo.
Mi version de FWH es 8.02 y el codigo corregido en concreto seria:
METHOD KeyChar( nKey, nFlags) CLASS TDBCombo
local nNewAT := 0, nOldAT:=::nAT
// Incremental search
if nKey = 32 // space resets the search
::cSearchKey := ""
::Set(1)
else
if nKey = VK_BACK
::cSearchKey := left(::cSearchKey,Len(::cSearchKey)-1)
else
::cSearchKey += upper(chr(nKey))
endif
nNewAT := ascan(::aList, {|x| upper(x) = ::cSearchKey} )
if nNewAt != nOldAt .and. nNewAT != 0 // If found and changed
if ::lSound
tone(60,.3) // sound if searchkey found
endif
::set( nNewAt )
if ::bChange != nil
if ::oGet != nil // Always not nil for dropdown
::oGet:VarPut( Eval( ::bSetGet ) ) // udate variable before calling bChange
::oGet:Refresh()
endif
Eval( ::bChange, Self, ::varGet() )
endif
return 0 // <- ACA ESTA EL CAMBIO!!!!!!!!
else
::cSearchKey := left(::cSearchKey,Len(::cSearchKey)-1)
endif
endif
Super:KeyChar(nKey, nFlags)
RETURN 0 // Must be 0 - We don't want API default behavior.Con esta correccion corre bien el DBCombo .
Saludos
Rolando
Sauro Srl.
Informática y Sistemas
Cochabamba - Bolivia
FWH 8.02 xharbour 1.1.0 (SimpLex)