Page 1 of 1

Búsqueda incremental en xHarbour

Posted: Wed Oct 25, 2006 7:36 pm
by Manuel Aranda
En Clipper+Fivewin el siguiente código funciona correctamente, es decir cada vez que se introduce una letra en el GET el Listbox se mueve hasta el registro que contiene esas letras, sin embargo con FWH el Listbox no se mueve conforme se van introduciendo letras, solamente cuando se pulsa la tecla retroceso después de introdocir una cadena. Por favor, pueden echarle un vistazo al código ?, tal vez sea necesaria alguna optimización para xHarbour pero no encuentro que puede ser:

Code: Select all

 REDEFINE GET oGet VAR cText ID 801 PICTURE "@!" OF oDlg;
     ON CHANGE ( Self:Assign(),;
     Locator(""+SubStr(cText,1,Self:nPos-1)+Upper(Chr( nKey )),oLbx,cUsaBase) )


*********#######*****************
FUNCTION LOCATOR(cKey,oB,cUsaBase)
*********#######*****************
// oB = TWBrowse Object, cKey = Contenido del Get
local nSeekrec
//
nSeekrec:=(cUsaBase)->(Recno())
IF GetASyncKey( VK_BACK )
cKey := SubStr(cKey,1,Len(cKey)-1)
EndIF

(cUsaBase)->(DbSeek(cKey,.T.))
If !Found()
GO nSeekrec
EndIF
//
oB:Refresh()
//
RETURN( NIL )
//

Posted: Wed Oct 25, 2006 10:39 pm
by Antonio Linares
Manuel,

Aqui tienes un ejemplo completo:
http://fivetechsoft.com/forums/viewtopi ... ncremental

Posted: Thu Oct 26, 2006 5:23 am
by Francisco Horta
que tal manuel,
yo uso la busqueda incremental en la msgbar con la twbrowse tee paso un ejemplo de su uso, espero te sirva:

LOCAL cDefaulMsg:=""
DEFINE DIALOG oDls bla bla bla...
REDEFINE LISTBOX oBrs ;
FIELDS (oDCli)->Nombre, (oDCli)->Codigo bla bla bla ....

oBrs:bSeek := {|lRet| oBrs:DbfSeek(.T.) }
oBrs:bUpdateBuffer:= {|| UpdateBuffer( oDls:oMsgBar, ;
cDefaultMsg, oBrs:cBuffer ) }

ACTIVATE DIALOG oDls CENTERED;
ON INIT MsgBarra(oDls,cDefaultMsg)

STAT FUNCTION MsgBarra(oDls,cDefaultMsg)
SET MESSAGE OF oDls TO cDefaultMsg NOINSET
RETURN Nil

FUNCTION UpdateBuffer( oMsgBar, cDefaultMsg, cBuffer )
local nClrText:= oMsgBar:nClrText
local cMsg, oFont

DEFINE FONT oFont NAME "Ms Sans Serif" SIZE 0,-10 BOLD

if Len( cBuffer ) > 0
cMsg:= "Buscando: " + upper(cBuffer)
oMsgBar:nClrText:= CLR_BLUE
oMsgBar:SetFont(oFont)
else
cMsg:= cDefaultMsg
endif
oMsgBar:SetMsg( PadR( cMsg ,200) )
oMsgBar:nClrText:= nClrText
oFont:End()
return Nil

Salu2
Paco

Posted: Thu Oct 26, 2006 11:30 am
by Manuel Aranda
Gracias Antonio y Francisco. Lo pruebo.

Un saludo,
Manuel