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