buscar la primera letra en un listobx

buscar la primera letra en un listobx

Postby QAZWSX2K » Fri Jan 21, 2011 8:17 pm

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
Software especializado para oficinas contables con grandes volumenes de Informacion
Impresion de todos los formularios del Seniat, Dian

alex_patino74@hotmail.com
whatsapp 57+3214777217
User avatar
QAZWSX2K
 
Posts: 364
Joined: Tue Oct 25, 2005 7:06 pm
Location: Bogota - Caracas

Re: buscar la primera letra en un listobx

Postby Manuel Aranda » Fri Jan 21, 2011 9:28 pm

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  Expand view

//
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 )
 
Un saludo,
Manuel

xH 1.2.3, FWH 23.07 32 bits, BC++ 7.4, xVerce CW 1.0, PellesC
User avatar
Manuel Aranda
 
Posts: 604
Joined: Wed Oct 19, 2005 8:20 pm
Location: España

Re: buscar la primera letra en un listobx

Postby Raymundo Islas M. » Sat Jan 22, 2011 4:07 am

QAZWSX2K,

Code: Select all  Expand view

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
FWH 10.6 + xHarbour + Borland 582
User avatar
Raymundo Islas M.
 
Posts: 592
Joined: Tue Mar 14, 2006 11:34 pm
Location: Acapulco, Gro. MEXICO

Re: buscar la primera letra en un listobx

Postby Willi Quintana » Sat Jan 22, 2011 3:31 pm

Hola, uso esto con mucho exito,,,,

Code: Select all  Expand view

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)

 
User avatar
Willi Quintana
 
Posts: 1019
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú

Re: buscar la primera letra en un listobx

Postby QAZWSX2K » Sat Jan 22, 2011 5:33 pm

gracias a todos, las pruebo todoas y les comento
Software especializado para oficinas contables con grandes volumenes de Informacion
Impresion de todos los formularios del Seniat, Dian

alex_patino74@hotmail.com
whatsapp 57+3214777217
User avatar
QAZWSX2K
 
Posts: 364
Joined: Tue Oct 25, 2005 7:06 pm
Location: Bogota - Caracas


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 47 guests