Shell   01-09-2022, 13:12
#1
Buenas!.

Después de dar muchas vueltas e intentando crear un código que lo hiciera, resulta que Gambas tiene el componente gb.data
que incluye la clase List que es una lista circular doblemente enlazada.

La idea del ejemplo es que tengo tres cajas de texto y al pulsar la tecla Enter o la Intro, el foco pasa de la primera a la segunda,
de la segunda a la tercera y cuando llega a la última y volvemos a pulsar Enter, vuelve a comenzar por la primera.

En este caso necesita que se pulse Enter. No me vale la tecla de tabulación.

[Imagen: ZAiisAz.png]

Código:
Private lista As List

Public Sub Form_Open()
 
  Me.Title = "Enfoque Circular"
  lista = New List
 
  'El primer elemento de la lista es el último insertado (la cabeza)
  'Una pila de TextBoxes en este caso. El tipo de dato que admite es Variant
 
  lista.Append(TextBox1)
  lista.Append(TextBox2)
  lista.Append(TextBox3)
 
End

Public Sub CajasDeTexto_KeyPress()
 
  If Key.code = Key.Return Or Key.code = Key.Enter Then     
    'Probar a cambiar del método MovePrev a MoveNext y ver el efecto
    
    'Se mueve al valor anterior. Si el actual era el primer valor, se convertirá en el último.
    
    lista.MovePrev
    
    'Se mueve del actual elemento al siguiente y si el actual es el último, se convertirá en el primero (es ciclico)
    'lista.MoveNext
    
    'Value es la caja de texto en si
    lista.Current.Value.SetFocus  
  Endif  
 
End

Saludos
Archivos adjuntos
.gz
CajasDeTextoFocoCircular-0.0.1.tar.gz (Tamaño: 12.5 KB Descargas: 3)
Última modificación: 01-09-2022, 13:19 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
cogier   01-09-2022, 15:45
#2
Prueba a sustituir todo el código por lo siguiente: - 

Código:
Public Sub CajasDeTexto_KeyPress()

  Dim hTBs As TextBox[] = [TextBox1, TextBox2, TextBox3, TextBox1]

  If Key.code = Key.Return Or Key.code = Key.Enter Then hTBs[hTBs.Find(Last) + 1].SetFocus

End
Shell   01-09-2022, 16:17
#3
(01-09-2022, 15:45)cogier escribió: Prueba a sustituir todo el código por lo siguiente: - 

Efectivamente. Era posible hacerlo de otra forma. Wink
Tu código está más optimizado que este último que iba a subir y que el primero.

Supongo que la lista indexada circular tendrá un mejor uso.
Tampoco conocía el componente gb.data

Este es el código que se me ocurrió para sustituir al primero que subí. Es que las cosas no salen a la primera. Tongue
Con lo sencillo que era con un array!.

Código:
Private lista As TextBox[]
Private indice As Integer

Public Sub Form_Open()
 
  lista = New TextBox[]
 
  lista.Insert([TextBox1, TextBox2, TextBox3])
 
End

Public Sub CajasDeTexto_KeyPress()
 
  If Key.Code = Key.Enter Or Key.code = Key.Return Then
    If indice = lista.Max Then
      indice = 0
    Else
      indice += 1
    Endif
    lista[indice].SetFocus    
  Endif
 
End

Quizás este último código que muestro sea menos enrevesado por la sintaxis del método find del array, pero es más largo.

Saludos

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
  
Usuarios navegando en este tema: 1 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.