In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

ListBox rotativo

Foro público de Xailer en español
Responder
Jesus Semper
Mensajes: 54
Registrado: Lun Ene 04, 2010 2:40 pm

ListBox rotativo

Mensaje 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?
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

ListBox rotativo

Mensaje 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
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Jesus Semper
Mensajes: 54
Registrado: Lun Ene 04, 2010 2:40 pm

ListBox rotativo

Mensaje 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
Responder