Spanish SOLUCION(B4J) Al intentar limitar la longitud de un Textfield el cursor salta al principio del texto

Seneca

Active Member
Licensed User
Hola.

Estoy intentando limitar la longitud de la cadena introducida en un Textfield a una longitud preestablecida, pero me ocurre que al hacerlo el cursor salta a la primera posición de la cadena.

B4X:
Sub txtTitulo_TextChanged (old As String, new As String)
    Dim longitud As Int = txtTitulo.Text.Length
    If longitud > maxTitulo Then 'Variable preestablecida con la longitud máxima
        'He probado con las dos opciones siguientes
'        txtTitulo.Text = old '*1*
        txtTitulo.Text = new.SubString2(0, maxTitulo) '*2*
    End If
End Sub

Cuando la longitud de la cadena introducida llega al tope, y se ejecuta la línea marcada como *1* o *2*, el cursor me salta a la primera posición de la cadena. Lo ideal es que el cursor no cambiase de sitio.

¿Cómo puedo conseguirlo?

Saludos.
 

Ferbis

Active Member
Licensed User
Longtime User
Hola Seneca,

Echa un vistazo al código de Pendrush

https://www.b4x.com/android/forum/threads/textfield-limit-text-length.76109/

B4X:
Sub txt1_TextChanged (Old As String, New As String)

    Dim sb As StringBuilder
    sb.Initialize
    For i = 0 To New.Length - 1
        If "0123456789".IndexOf(New.CharAt(i)) > -1 Then
        sb.Append(New.CharAt(i))
        End If
    Next
    If sb.ToString.Length > 3 Then
        txt1.Text = sb.ToString.SubString2(0,3)
    Else
        txt1.Text = sb.ToString
    End If
    txt1.SetSelection(txt1.Text.Length, txt1.Text.Length)
End Sub

Él lo ha limitado a 3 caracteres numéricos.

Salu2
 

Seneca

Active Member
Licensed User
Hola.

Conocía ese hilo, pero no le había echado muchas cuentas porque veía que usaba un método similar al mío para limitar la longitud. En lo que no había reparado es en: txt1.SetSelection(txt1.Text.Length, txt1.Text.Length) que lo que hace es situar el cursor al final de la cadena cuando se alcanza la longitud máxima establecida.

He aprovechado esta idea, pero mejorándola para que el cursor no salte al final, sino que permanezca en la misma posición en la que estaba al escribir y alcanzar la longitud máxima.

B4X:
Sub txtTitulo_TextChanged (old As String, new As String)
    Dim posicion As Int = txtTitulo.SelectionStart
    Dim longitud As Int = txtTitulo.Text.Length  
    If longitud <= maxTitulo Then 'Variable preestablecida con la longitud máxima
        lblTituloCount.Text = txtTitulo.Text.Length & "/" & maxTitulo
    Else
        txtTitulo.Text = old
        txtTitulo.SetSelection(posicion-1, posicion-1)
    End If
    lblTitulo.Text = txtTitulo.Text
End Sub
Gracias @Ferbis por el aporte.
 
Top