Page 1 of 1
buscar la primera letra en un listobx
Posted: Fri Jan 21, 2011 8:17 pm
by QAZWSX2K
Saludos amigos, tengo un listbox con un array, es una lista de clientes por nombre, lo que necesito y no se como hacerlo es que al oprimir la tecla t, vaya a donde empiecen por t, no quiero una busqueda incrementan que vaya buscando por varias letras, solo la primera, asi como se hacia antes en clipper, aca esta el codigo
bien a esta punto ya viene el arreglo con n nombres de clientes y codigos
DEFINE DIALOG DIALOGO TITLE " Buscar por Nombre " FROM 5,5 TO 320,450 FONT OFONT PIXEL
@ 006, 005 say " Empresas" PIXEL font font55 COLOR CLR_RED
@ 020, 005 listbox olbx
FIELDS EMPRE[NCUR][1],EMPRE[NCUR][2],"" HEADERS "Nombre", "Codigo","" ;
ON DBLCLICK (Dialogo:End(),EXISTE(VAL(EMPRE[NCUR,2])) ) OF Dialogo size 15,110 pixel
oLbX:bGoTop = { || nCur := 1 }
oLBX:bGoBottom = { || nCur := Len( EMPRE ) }
oLbX:bSkip = { | nSkip | Skipper( EMPRE, @nCur, nSkip ) } // con array
oLbX:bLogicLen := { || LEN(EMPRE) }
oLbX:cAlias := "Array"
oLbX:bKeydown := { | nKey | IF ( nKey == VK_RETURN , EVAL(oLBX:bLDblClick), NIL ) }
oLbX:aColSizes := {342,60,1}
oLbX:lCellStyle := .T.
oLbX:aJustify := { .F.,.F.,.F.}
oLbX:nLineStyle = 4 //0=nada, 2=delgada negra, 1=gruesa negra, 3=gris, 4=punteada
ACTIVATE DIALOG DIALOGO
como dije solo quiero que si se aprieta "T" vaya a las que empiezan por t, que si se aprieta "R" vaya a las que empiezan por r, etc
gracias
Re: buscar la primera letra en un listobx
Posted: Fri Jan 21, 2011 9:28 pm
by Manuel Aranda
Seguramente habrá alguna forma más limpia y moderna de hacerlo, pero yo uso esta desde tiempos inmemoriables y que alguien puso por aquí en su día, y siguiendo la máxima de que "si funciona no lo toques" es la que yo uso desde siempre:
Code: Select all
//
oLbx:bkeydown:={|nKey|DOKEYCHECK(nKey,oLbx)}
//
*******************************************************
METHOD FUNCTION DOKEYCHECK(nKey,oLbx)
*******************************************************
*------SINGLE CHARACTER BROWSE SEARCHER----------------------
local cKEY, nSeekrec
nSeekrec:=recno() && Record number before the seek...
&& Note ASCII values: 65-90 are Capital A through Z.
&& : 97-122 are lowercase a through z.
&& : 48-57 are numbers 0-9.
&& : 13 used below is for a RETURN key hit.
//
IF nKEY>=65 .AND. nKEY<=90 .OR. nKEY>=97 .AND. nKEY<=122 .OR. nKEY >=48 .AND. nKEY<=57
//
cKey:=UPPER(CHR(nKEY)) && Change ACSII nKey value to a Character value for the SEEK...
//
SET SOFTSEEK ON && Get as close as you can to the key value...
SEEK UPPER(cKey)
SET SOFTSEEK OFF && Reset softseek
oLbx:oVscroll:setpos(recno()) && Refresh browser object sequence...
oLbx:refresh() &&
oLbx:UpStable() && Stablize
SysRefresh()
RETURN( NIL ) && Drop out!
ENDIF
//
//
*-RECORD SELECTION AFTER A RETURN KEY HIT...POSSIBLY TO DROP TO EDIT WINDOW -*
DO CASE
/*
CASE nKEY == VK_CONTROL
MSGINFO("Esto es el tabuladoraaa!!!...")
*/
CASE nKEY == VK_SPACE
//
CASE nKEY == VK_RETURN
//
*/
ENDCASE
//
RETURN( NIL )
Re: buscar la primera letra en un listobx
Posted: Sat Jan 22, 2011 4:07 am
by Raymundo Islas M.
QAZWSX2K,
Code: Select all
oListBox:bKeyDown := { |nKey| FindLtr( nKey ) }
Static Function FindLtr( nKey )
local nEle := ascan( Empre, { |aEle| substr( aEle[1], 1, 1 ) == upper( chr( nKey ) ) } )
if nEle > 0
nCur := nEle
oListBox:refresh()
endif
return nil
Espero te sirva.
Saludos
Re: buscar la primera letra en un listobx
Posted: Sat Jan 22, 2011 3:31 pm
by Willi Quintana
Hola, uso esto con mucho exito,,,,
Code: Select all
oApp:cDatSeek:="" // esta es una variable de uso en toda la aplicacion
...
...
REDEFINE LISTBOX oLbx ;
FIELDS aBalance[oLbx:nAt, 1], ;
aBalance[oLbx:nAt, 2], ;
aBalance[oLbx:nAt, 3], ;
aBalance[oLbx:nAt, 4], ;
aBalance[oLbx:nAt, 5], ;
aBalance[oLbx:nAt, 6] ;
HEADERS ...........
ON CHANGE (oApp:cDatSeek:="" ) ;
ID ...........
oLbx:bKeyDown := {|nKey,nFlags| ASEEK(oLbx, nKey, aBalance, 1)), oLbx:SetFocus()}
//---------------------------------------------------------------------------------------
Function ASEEK(oLbx, nKey, aArray, nCol, nCol2, nFact) // incremental en array
local nPos, nLen, cDato, nCont
DEFAULT nCol2 := 0
DEFAULT nFact := 0
cDato := ""
nPos := 0
DO CASE
CASE nKey = 13 .OR. nKey = 9 // enter y tab
oApp:cDatSeek := ""
cDato := oApp:cDatSeek
Return(Nil)
CASE nKey = 8 // retroceso
oApp:cDatSeek := SUBSTR(oApp:cDatSeek,1,LEN(oApp:cDatSeek)-1)
cDato := oApp:cDatSeek
CASE nKey >=65 .AND. nKey <=90 .OR. nKey =32 .OR. nKey = 189 .OR. nKey = 190 .OR. nKey = 192// son letras
DO CASE
CASE nKey = 189
cDato := oApp:cDatSeek + "-"
CASE nKey = 190
cDato := oApp:cDatSeek + "."
CASE nKey = 192
cDato := oApp:cDatSeek + "Ñ"
OTHER
cDato := oApp:cDatSeek + CHR(nKey)
ENDCASE
oApp:cDatSeek := cDato
OTHER
oApp:cDatSeek := ""
cDato := oApp:cDatSeek
Return(Nil)
ENDCASE
nLen := LEN(cDato)
nPos := ASCAN(aArray, {|aVal|SUBST(ALLTRIM(aVal[nCol]),1, nLen) = cDato})
If nPos > 0
oLbx:nAt := nPos
oLbx:Refresh()
EndIf
Return(Nil)
Re: buscar la primera letra en un listobx
Posted: Sat Jan 22, 2011 5:33 pm
by QAZWSX2K
gracias a todos, las pruebo todoas y les comento