Página 1 de 1

ListBox rotativo

Publicado: Lun May 14, 2007 11:56 pm
por Jesus Semper
Quiero que en un ListBox, cuando pulse cursor arriba, si esta en el primero,
se vaya al ultimo elemento y si esta en el ultimo, vaya al primero.
Lo pruebo con algo asi:
//---------------------------------------------------------- ----------------
----
METHOD Listbox1KeyDown( oSender, nKey, nFlags ) CLASS TForm1
LOCAL nOpciones := Len(::oListbox1:aItems)
LOCAL nOpcActual:= ::oListbox1:nIndex
DO CASE
CASE nKey = 38 // Arriba
if nOpcActual = 1
::oListbox1:nIndex := nOpciones
endif
CASE nKey = 40 // Abajo
if nOpcActual = nOpciones
::oListbox1:nIndex := 1
endif
ENDCASE
RETURN Nil
//---------------------------------------------------------- ----------------
----
pero esto me posiciona en el segundo y penultimo respectivamente.
Es como si se colocara y luego, ademas , ejecutara la accion de movimiento
correspondiente.
¿Alguien sabe como resolverlo?

ListBox rotativo

Publicado: Jue May 17, 2007 3:16 pm
por jfgimenez
Jesus,
> Quiero que en un ListBox, cuando pulse cursor arriba, si esta en el
> primero,
> se vaya al ultimo elemento y si esta en el ultimo, vaya al primero.
>
> Lo pruebo con algo asi:
>
> //---------------------------------------------------------- ----------------
> ----
> METHOD Listbox1KeyDown( oSender, nKey, nFlags ) CLASS TForm1
>
> LOCAL nOpciones := Len(::oListbox1:aItems)
> LOCAL nOpcActual:= ::oListbox1:nIndex
>
> DO CASE
> CASE nKey = 38 // Arriba
> if nOpcActual = 1
> ::oListbox1:nIndex := nOpciones
> endif
> CASE nKey = 40 // Abajo
> if nOpcActual = nOpciones
> ::oListbox1:nIndex := 1
> endif
> ENDCASE
>
> RETURN Nil
> //---------------------------------------------------------- ----------------
> ----
>
> pero esto me posiciona en el segundo y penultimo respectivamente.
> Es como si se colocara y luego, ademas , ejecutara la accion de movimiento
> correspondiente.
> ¿Alguien sabe como resolverlo?
Cuando procesas una tecla, debes retornar 0, o de lo contrario el control
volverá a procesarla. En este caso, cuando vuelves a situarte en el primer
elemento y retornas Nil, el control vuelve a procesar la tecla, y por eso se
queda en el segundo elemento.
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info

ListBox rotativo

Publicado: Jue May 17, 2007 10:15 pm
por Jesus Semper
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:464c5599$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> Jesus,
>
> > Quiero que en un ListBox, cuando pulse cursor arriba, si esta en el
> > primero,
> > se vaya al ultimo elemento y si esta en el ultimo, vaya al primero.
> >
> > Lo pruebo con algo asi:
> >
> >
//---------------------------------------------------------- ----------------
> > ----
> > METHOD Listbox1KeyDown( oSender, nKey, nFlags ) CLASS TForm1
> >
> > LOCAL nOpciones := Len(::oListbox1:aItems)
> > LOCAL nOpcActual:= ::oListbox1:nIndex
> >
> > DO CASE
> > CASE nKey = 38 // Arriba
> > if nOpcActual = 1
> > ::oListbox1:nIndex := nOpciones
> > endif
> > CASE nKey = 40 // Abajo
> > if nOpcActual = nOpciones
> > ::oListbox1:nIndex := 1
> > endif
> > ENDCASE
> >
> > RETURN Nil
> >
//---------------------------------------------------------- ----------------
> > ----
> >
> > pero esto me posiciona en el segundo y penultimo respectivamente.
> > Es como si se colocara y luego, ademas , ejecutara la accion de
movimiento
> > correspondiente.
> > ¿Alguien sabe como resolverlo?
>
> Cuando procesas una tecla, debes retornar 0, o de lo contrario el control
> volverá a procesarla. En este caso, cuando vuelves a situarte en el primer
> elemento y retornas Nil, el control vuelve a procesar la tecla, y por eso
se
> queda en el segundo elemento.
>
> --
> Un saludo,
>
> José F. Giménez
> http://www.xailer.com
> http://www.xailer.info
>
>
Muchas gracias. Funciona perfecto. Lo he dejado asi:
METHOD Listbox1KeyDown( oSender, nKey, nFlags ) CLASS TForm1
LOCAL cCar := Chr(nKey)
LOCAL nOpciones := Len(::oListbox1:aItems)
LOCAL nOpcActual:= ::oListbox1:nIndex
//MsgInfo(Str(nKey), "Tecla")
DO CASE
CASE nKey = 27 // Esc
::oEdit1:Value := "SALIR"
CASE nKey = 13 // Enter
::oEdit1:Value := "INTRO"
::oListBox2:lVisible := .T.
::oListBox2:SetFocus()
CASE nKey = 39 // Derecha
::oEdit1:Value := "DERECHA"
::oListBox2:lVisible := .T.
::oListBox2:SetFocus()
CASE nKey = 37 // Izquierda
::oEdit1:Value := "IZQUIERDA"
CASE nKey = 38 // Arriba
::oEdit1:Value := "ARRIBA"
if nOpcActual = 1
MsgBeep()
::oListbox1:nIndex := nOpciones
return 0
endif
CASE nKey = 40 // Abajo
::oEdit1:Value := "ABAJO"
if nOpcActual = nOpciones
MsgBeep()
::oListbox1:nIndex := 1
return 0
endif
CASE nKey = 36 // Inicio
::oEdit1:Value := "INICIO"
CASE nKey = 35 // Fin
::oEdit1:Value := "FIN"
CASE nKey = 34 // AvPag
::oEdit1:Value := "AvPAG"
CASE nKey = 33 // RePag
::oEdit1:Value := "RePAG"
ENDCASE
nOpcActual:= ::oListbox1:nIndex
::oLabel1:cText = Str(nOpcActual)
RETURN NIL