Shell   25-01-2023, 00:49
#1
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]

Código:
' Gambas class file

'Se pretende que todas las cajas de texto contenga la misma cadena que la etiqueta
'Sin importar el número de cajas de texto que se use

Const NUMCAJASDETEXTO As Integer = 3
Const TEXTO As String = "prueba"

Private cajas As New Integer[]
Private etiqueta1 As Label
Private etiqueta2 As Label
Private cajadetexto As TextBox

Public Sub Form_Open()

  With Me
    .Arrangement = Arrange.Vertical
    .Width = 200
    .Spacing = True
    .Margin = True
    .AutoResize = True
  End With

  etiqueta1 = New Label(Me)
  With etiqueta1
    .Font = Font["Arial, 24, Bold"]
    .Alignment = Align.Center
    .Text = TEXTO
    .H = 50
    .W = 150
  End With

  For j As Integer = 0 To NUMCAJASDETEXTO - 1
    cajadetexto = New TextBox(Me) As "Manipula"
    With cajadetexto
      .Font = Font["Arial, 18, Bold"]
      .Alignment = Align.Center
      .H = 50
      .w = 150
      .Tag = j
    End With
  Next

  etiqueta2 = New Label(Me)
  With etiqueta2
    .Font = Font["Arial, 20, Bold"]
    .Alignment = Align.Center
    .Text = ""
    .H = 50
    .W = 150
  End With

End

Public Sub Manipula_Change()

  Dim ocajadetexto As Object

  'Comprueba cada cambio en las cajas de texto

  For Each ocajadetexto In Me.Controls
    If ocajadetexto Is TextBox Then
      If Last.text = etiqueta1.Text Then
        If cajas.Find(Last.tag) = -1 Then cajas.Add(Last.tag)
        If cajas.Count = NUMCAJASDETEXTO Then
          etiqueta2.text = "Son iguales"
        Else
          etiqueta2.Text = ""
        Endif
      Else
        etiqueta2.Text = ""
      Endif
    Endif
  Next

End

Public Sub Manipula_KeyPress()

  'Comprueba si se ha pulsado la tecla de retroceso o borrar
  If Key.code = Key.Backspace Or Key.Code = Key.Delete Then
    'Si el tag de la caja de texto donde se escribe se encuentra en cajas
    If cajas.Find(Last.tag) <> -1 Then
      'Elimina el tag de cajas
      cajas.Remove(cajas.Find(Last.tag))
      'Limpia el contenido de la etiqueta2
      etiqueta2.Text = ""
    Endif
  Endif

End

Saludos
Archivos adjuntos
.gz
CajasDeTextoEventoChange-0.0.1.tar.gz (Tamaño: 12.49 KB Descargas: 1)
Última modificación: 25-01-2023, 20:01 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shordi   25-01-2023, 02:09
#2
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

No podemos regresar
Shell   25-01-2023, 15:29
#3
(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
Última modificación: 25-01-2023, 15:33 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shell   25-01-2023, 19:59
#4
Así también funciona, no tags, no array, no KeyPress.  Wink
Me he valido de un contador y he cambiado el evento Change,

Código:
Const NUMCAJASDETEXTO As Integer = 3
Const TEXTO As String = "prueba"

Private etiqueta1 As Label
Private etiqueta2 As Label
Private cajadetexto As TextBox

Public Sub Form_Open()

  With Me
    .Arrangement = Arrange.Vertical
    .Width = 200
    .Spacing = True
    .Margin = True
    .AutoResize = True
  End With

  etiqueta1 = New Label(Me)
  With etiqueta1
    .Font = Font["Arial, 24, Bold"]
    .Alignment = Align.Center
    .Text = TEXTO
    .H = 50
    .W = 150
  End With

  For j As Integer = 0 To NUMCAJASDETEXTO - 1
    cajadetexto = New TextBox(Me) As "Manipula"
    With cajadetexto
      .Font = Font["Arial, 18, Bold"]
      .Alignment = Align.Center
      .H = 50
      .w = 150
      .Tag = j
    End With
  Next

  etiqueta2 = New Label(Me)
  With etiqueta2
    .Font = Font["Arial, 20, Bold"]
    .Alignment = Align.Center
    .Text = ""
    .H = 50
    .W = 150
  End With

End

Public Sub Manipula_Change()

  Dim ocajadetexto As Object
  Dim cuenta As Integer

  For Each ocajadetexto In Me.Controls
    If ocajadetexto Is TextBox Then
      If ocajadetexto.text = etiqueta1.Text Then cuenta += 1
    Endif
  Next

  If cuenta = NUMCAJASDETEXTO Then
    etiqueta2.Text = "Son iguales"
  Else
    etiqueta2.Text = ""
  Endif
  cuenta = 0

End

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.
Archivos adjuntos
.gz
CajasDeTextoEventoChange-0.0.2.tar.gz (Tamaño: 12.49 KB Descargas: 0)
Última modificación: 25-01-2023, 20:13 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shordi   25-01-2023, 23:12
#5
Código:
 For Each ocajadetexto In Me.Controls
    If ocajadetexto Is TextBox Then
      If ocajadetexto.text = etiqueta1.Text Then cuenta += 1
    Endif
  Next
Eso se parece mucho más a lo que yo había pensado. Es el eterno principio de KISS.

Saludos
Última modificación: 25-01-2023, 23:14 por Shordi.

No podemos regresar
Shell   26-01-2023, 12:46
#6
(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.

"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.