Problema al seleccionar en un cuadro de texto largo

Como indico en el título, tengo un problema al entrar, o recibir el foco, lo que quieras, da igual, en un campo largo.

Como el comportamiento de inicio es un poco raro, ya que selecciona el primer carácter, le tengo puesto este código:

    Me.Caracteristicas.SelStart = IIf(IsNull(Me.Caracteristicas), 1, Me.Caracteristicas.SelLength)

Pero una vez que no es nulo, cuando vuelvo a pinchar en él, me lleva a la posición que le da la gana, no la que yo he seleccionado.

Te he grabado un vídeo para que veas el comportamiento:

https://www.dropbox.com/s/tv10a5r0wjp7f9v/Duda.mp4?dl=0 

Para "arreglar" este comportamiento, si duplico el código anterior, sí me lo soluciona. Pero no sé porqué.

¿Cómo puedo solucionar ambos comportamiento de una vez?

1 Respuesta

Respuesta
1

En el vídeo no oigo casi nada, así que te comento cosas, a ver si alguna te sirve:

1º/ aunque lo eventos "al entrar" y "al recibir el enfoque" son parecidos, no son iguales y no funcionan igual, por lo que es importante saber qué quieres hacer y cuando (y para mi que no te sirve ninguno).

2º/ SelLength devuelve el número de caracteres seleccionados en un cuadro de texto (o en parte de él). En tu caso, como no has seleccionado nada, pasan dos cosas: si el campo es nulo, te coloca el inicio en la posición 1 (porque así se lo indicas) y es lo que en el vídeo parece que te selecciona un caracter. Sin embargo, si el campo ya tiene un valor, al no haber nada seleccionado, SelLength devuelve 0 (lo puedes comprobar si ejecutas el código paso a paso) y por tanto la posición de inicio es la 0.

3º/ Además, por lo que veo en el vídeo, en el campo texto largo te posicionas con el ratón, lo que hace que intervenga otro evento (al hacer clic), que se ejecuta después de los otros dos. Además, al hacer clic, el cursor se te posiciona en donde hayas hecho clic (por eso se te coloca el cursor "donde le da la gana")

¿Qué es lo que quieres hacer? ¿Qué se te ponga al final de todo lo que haya escrito? Eso lo puedes hacer de varias formas, en varios eventos y sobre todo, dependiendo de cómo "entres" al control.

Por ejemplo: http://www.filebig.net/files/tiqPGExKW4  

En FTabla1_1 (evento got_focus), si te mueves con el tabulador, el cursor se coloca al final del último caracter. Si te mueves con Intro, se coloca en una linea nueva (por las propiedades del control). Si te posicionas en el cuadro con el ratón, se queda donde hayas hecho el clic.

En FTabla1_2 (evento enter), el comportamiento es exactamente el mismo.

En FTabla1_3 (evento clic), si te mueves con tab o intro, el comportamiento es seleccionar todo el contenido del campo, mientras que si te colocas con el ratón, se te va el cursor a continuación del último caracter. En este caso, el código cambia ligeramente y en vez de usar SelLength, uso la función Len()

Hola. La forma de hacerlo es exactamente igual a la que utilizo en la base de datos. Por tanto, he analizado si en el transcurso de pasar de un campo cualquiera al campo de texto largo hacía algo entremedias, y no. Así que lo que he hecho ha sido replicar el formato de mi base de datos en la tuya, y copiar el texto.

Si pruebas con el formulario 2, que es el que he modificado, verás que cuando entras al formulario lo hace bien; pero si lo intentas dos o más veces, te envía a donde él le da la gana.

http://www.filebig.net/files/adT8Tsh86K 

Muchas gracias.

Pues, Diego, no lo veo...

Abro el formulario FTabla1_2, con el tabulador paso del campo Producto a Características y viceversa y siempre que le toca a Características el cursor se posiciona al final de "MOSQUITERA LINDAPLUS BLANCA ANCHO 120 X ALTO 210", y da igual las veces que lo haga.

Su uso la tecla INTRO para pasar del campo Producto a características, lo mismo, el cursor se pone al final de todo lo escrito.

Si uso el ratón, el cursor se posiciona más o menos por donde hago clic. No lo hace exactamente porque al entrar al campo, el tipo de letra es diferente, con otro ancho.

No me has respondido a lo que pretendes conseguir con ese código, si es seleccionar todo o parte del contenido, o posicionar el cursor el final de todo el contenido del campo o al principio. Porque según lo que quieras hacer (y sobre todo cómo te vayas a colocar en el campo), tendrás que programar un evento u otro y un código u otro.

Hola.

Objetivo: que, al usar el ratón, se posicione en el lugar del campo Caracteristicas donde realmente pinche. Ejemplo: si pincho justo después del 163, que se quede ahí, y no se vaya más adelante.

Creo que ya sé dónde está problema, y tú lo has dicho. Reproduzco tus palabras: "No lo hace exactamente porque al entrar al campo, el tipo de letra es diferente, con otro ancho".

Yo he conseguido arreglarlo poniendo dos veces el código que usas en el formulario 2 (el que editado con el mismo diseño que mi formulario).

¿Me explico?

¿Hay solución para eso?

Muchas gracias.

OK, ahora entiendo lo que buscas. El problema está en que el contenido de tu campo texto largo (el mismo que has pegado en la BD de ejemplo) tiene formato con texto enriquecido. Si abres la tabla y ves el contenido del campo, no contiene:

Windverticalblan4 cwoind ver. 42 BLANCO 130X163
Lindaplus 1 mosquitera lindaplus blanca ancho 90 x alto 210
Windverticalblan1 cwoind ver. 42 BLANCO 130X100
LINDAPLUS 1 MOSQUITERA LINDAPLUS BLANCA ANCHO 120 X ALTO 210

sino que contiene:

<div><font size=1>WINDVERTICALBLAN4 CWOIND VER.42 BLANCO 130X163</font></div>
<div><font size=1>LINDAPLUS 1 MOSQUITERA LINDAPLUS BLANCA ANCHO 90 X ALTO 210</font></div>
<div><font size=1>WINDVERTICALBLAN1 CWOIND VER.42 BLANCO 130X100</font></div>
<div><font size=1>LINDAPLUS 1 MOSQUITERA LINDAPLUS BLANCA ANCHO 120 X ALTO 210</font></div>

Es decir, que en le propio contenido del campo le estás cambiando las características de la fuente.

Si le quitas el código, el comportamiento del cursor se acerca más a dónde haces clic con el ratón.

También puedes probar a formatear el contenido del campo lo más parecido al resto de controles, aunque esto tiene limitaciones. Por ejemplo, en la BD de pruebas, los campos son Calibri tamaño 11 y al campo texto largo solo lo puedo poner como Calibri 10 (con <div><font face=Calibri size=2>) o Calibri 12 ( con <div><font face=Calibri size=3>), pero no puedo indicarle un tamaño de fuente de 11...

Vale, ya entiendo. Entonces, no hay manera de poder contar los caracteres de ese campo largo con el formato incluido, para saber dónde hay que situar el cursor, ¿no?

¡Gracias!

Si lo dejo así funciona como quiero:

Private Sub Caracteristicas_GotFocus()
    If IsNull(Me.Caracteristicas) Then
        Me.Caracteristicas.SelStart = 1
    Else
        Exit Sub
    End If
End Sub

Así que, muchas gracias por la ayuda y la explicación.

Un saludo.

Pues si así te funciona, genial, pero para mi, poner ese código y no ponerlo es lo mismo:

Tu le dices que si no hay nada, el cursor se vaya al principio ( y si no hay nada, ya es a donde se iría...) y si hay algo, que no haga nada...😀

Respondiendo a tu duda anterior, no lo sé, habría que ver si len() cuenta o no los caracteres del formato, y sabiendo eso y como le das el valor y formato al campo, sería cuestión de " hacer números ".

Otra posible solución sería no usar <div> para separar líneas, sino usar <br> o <p> (uno de los dos creo que es, no recuerdo cual).

El problema de fondo es que al entrar al campo, se alterna entre texto con formato y texto sin formato.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas