Comunidad Gambas-es

Versión completa: Ejemplo. Cajas de textos con contenido idéntico. Evento Change
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Buenas!.

Se trata de que todas las cajas de texto tenga el mismo texto en todas.  En este caso el de la etiqueta.

[Imagen: loPqxRJ.png]

Si varía una sola letra, ya no es el mismo contenido y no se muestra la etiqueta inferior.

[Imagen: xsWarVr.png]

GAMBAS
  1. ' Gambas class file
  2.  
  3. 'Se pretende que todas las cajas de texto contenga la misma cadena que la etiqueta
  4. 'Sin importar el número de cajas de texto que se use
  5.  
  6. Const NUMCAJASDETEXTO As Integer = 3
  7. Const TEXTO As String = "prueba"
  8.  
  9. Private etiqueta1 As Label
  10. Private etiqueta2 As Label
  11. Private cajadetexto As TextBox
  12.  
  13. Public Sub Form_Open()
  14.  
  15.   With Me
  16.     .Arrangement = Arrange.Vertical
  17.     .Width = 200
  18.     .Spacing = True
  19.     .Margin = True
  20.     .AutoResize = True
  21.  
  22.   etiqueta1 = New Label(Me)
  23.   With etiqueta1
  24.     .Font = Font["Arial, 24, Bold"]
  25.     .Alignment = Align.Center
  26.     .Text = TEXTO
  27.     .H = 50
  28.     .W = 150
  29.  
  30.   For j As Integer = 0 To NUMCAJASDETEXTO - 1
  31.     cajadetexto = New TextBox(Me) As "Manipula"
  32.     With cajadetexto
  33.       .Font = Font["Arial, 18, Bold"]
  34.       .Alignment = Align.Center
  35.       .H = 50
  36.       .w = 150
  37.       .Tag = j
  38.     End With
  39.   Next
  40.  
  41.   etiqueta2 = New Label(Me)
  42.   With etiqueta2
  43.     .Font = Font["Arial, 20, Bold"]
  44.     .Alignment = Align.Center
  45.     .Text = ""
  46.     .H = 50
  47.     .W = 150
  48.  
  49.  
  50. Public Sub Manipula_Change()
  51.  
  52.   Dim ocajadetexto As Object
  53.  
  54.   'Comprueba cada cambio en las cajas de texto
  55.  
  56.   For Each ocajadetexto In Me.Controls
  57.     If ocajadetexto Is TextBox Then
  58.       If Last.text = etiqueta1.Text Then
  59.         If cajas.Find(Last.tag) = -1 Then cajas.Add(Last.tag)
  60.         If cajas.Count = NUMCAJASDETEXTO Then
  61.           etiqueta2.text = "Son iguales"
  62.         Else
  63.           etiqueta2.Text = ""
  64.         Endif
  65.       Else
  66.         etiqueta2.Text = ""
  67.       Endif
  68.     Endif
  69.   Next
  70.  
  71.  
  72. Public Sub Manipula_KeyPress()
  73.  
  74.   'Comprueba si se ha pulsado la tecla de retroceso o borrar
  75.   If Key.code = Key.Backspace Or Key.Code = Key.Delete Then
  76.     'Si el tag de la caja de texto donde se escribe se encuentra en cajas
  77.     If cajas.Find(Last.tag) <> -1 Then
  78.       'Elimina el tag de cajas
  79.       cajas.Remove(cajas.Find(Last.tag))
  80.       'Limpia el contenido de la etiqueta2
  81.       etiqueta2.Text = ""
  82.     Endif
  83.  



Saludos
No entiendo el propósito de tanto tejemaneje con el .tag de los textboxes ¿Por qué no preguntar por el .text y ya está?
Huh Huh
(25-01-2023, 02:09)Shordi escribió: [ -> ]No entiendo el propósito de tanto tejemaneje con el .tag de los textboxes ¿Por qué no preguntar por el .text y ya está?

El array cajas almacena el tag de las cajas de textos que son iguales al de la etiqueta. Hasta que no sean todas iguales no debe
mostrarse el mensaje que diga que son iguales todas. Ademas se comprueba que el  tag almacenado existe o no
verificando si esa caja en concreto contiene el mismo texto.

¿ De qué otra forma sabrías que todas son iguales ?. De x's cajas de texto. No vale que sean dos, que sean tres, tienen que ser x's cajas.
¿ Con un contador que iguale al del numero de cajas de texto ?.
Es un planteamiento naturalmente, que puede existir otros, no lo dudo.

Espera unos días a ver si se anima alguien más para resolver el problema. Rolleyes
Intentaré hacerlo solo con la propiedad text, parece lo más sencillo. El problema es llevar el control de todas las cajas de texto.
Que se muestre el mensaje "solo" cuando sean iguales y que no quede fijo, etc.

Aunque parezca increíble estos problemas llevan algo de tiempo. Y aunque para algunas personas resulta más fácil, para otras no lo es tanto.
No lo sé si por si le gusta complicarse, usando propiedades o por el planteamiento. Ahora hablo en tercera persona. Si es que no me gana ni el tato.

Saludos
Así también funciona, no tags, no array, no KeyPress.  Wink
Me he valido de un contador y he cambiado el evento Change,

GAMBAS
  1. Const NUMCAJASDETEXTO As Integer = 3
  2. Const TEXTO As String = "prueba"
  3.  
  4. Private etiqueta1 As Label
  5. Private etiqueta2 As Label
  6. Private cajadetexto As TextBox
  7.  
  8. Public Sub Form_Open()
  9.  
  10.   With Me
  11.     .Arrangement = Arrange.Vertical
  12.     .Width = 200
  13.     .Spacing = True
  14.     .Margin = True
  15.     .AutoResize = True
  16.  
  17.   etiqueta1 = New Label(Me)
  18.   With etiqueta1
  19.     .Font = Font["Arial, 24, Bold"]
  20.     .Alignment = Align.Center
  21.     .Text = TEXTO
  22.     .H = 50
  23.     .W = 150
  24.  
  25.   For j As Integer = 0 To NUMCAJASDETEXTO - 1
  26.     cajadetexto = New TextBox(Me) As "Manipula"
  27.     With cajadetexto
  28.       .Font = Font["Arial, 18, Bold"]
  29.       .Alignment = Align.Center
  30.       .H = 50
  31.       .w = 150
  32.       .Tag = j
  33.     End With
  34.   Next
  35.  
  36.   etiqueta2 = New Label(Me)
  37.   With etiqueta2
  38.     .Font = Font["Arial, 20, Bold"]
  39.     .Alignment = Align.Center
  40.     .Text = ""
  41.     .H = 50
  42.     .W = 150
  43.  
  44.  
  45. Public Sub Manipula_Change()
  46.  
  47.   Dim ocajadetexto As Object
  48.   Dim cuenta As Integer
  49.  
  50.   For Each ocajadetexto In Me.Controls
  51.     If ocajadetexto Is TextBox Then
  52.       If ocajadetexto.text = etiqueta1.Text Then cuenta += 1
  53.     Endif
  54.   Next
  55.  
  56.   If cuenta = NUMCAJASDETEXTO Then
  57.     etiqueta2.Text = "Son iguales"
  58.   Else
  59.     etiqueta2.Text = ""
  60.   cuenta = 0
  61.  



Había pensando en usar el evento LostFocus y el GetFocus de la caja.
Por eso digo que puede haber muchas formas de hacer algo y de ahí la complicación.
De lo que es hacer algo y que funcione a optimizar van dos pueblos.

Uno de los problemas es que me emperraba con Last.text, cuando debería haber usado desde el principio la caja de texto actual que se ve en el bucle.
ocajadetexto y su propiedad text.
GAMBAS
  1.  For Each ocajadetexto In Me.Controls
  2.     If ocajadetexto Is TextBox Then
  3.       If ocajadetexto.text = etiqueta1.Text Then cuenta += 1
  4.     Endif
  5.   Next


Eso se parece mucho más a lo que yo había pensado. Es el eterno principio de KISS.

Saludos
(25-01-2023, 23:12)Shordi escribió: [ -> ]Eso se parece mucho más a lo que yo había pensado. Es el eterno principio de KISS.

El código puede ser simple, pero llegar a el, no siempre es fácil creando una solución que puede ser efectiva,
funcional que nos haga lo que queríamos, aunque tomemos muchas veces el camino más largo.

Eso lo podemos ver a diario de códigos también de compañeros, no solo los propios.
Pero hay muchos motivos por lo que ocurre esto. No tenemos la misma mente, formación, educación,
el momento en el que se hace el código, estado de animo...la lista es larga. Y no olvidemos el tiempo disponible
y sobre todo, sobre todo, trabajar bajo presión.