Situar un textbox en función de otro anterior

Es una pregunta para Sveinbjorn El Rojo
Querría situar los controles de un formulario de manera que aparezcan todos en la misma horizontal y que uno tenga el cuadro de texto posicionado donde termina el anterior, de manera automática y no haciéndolo a mano.

Los controles son Titulo, Autor, Editorial, Distribuido, Año y deben de posicionarse, unos seguidos de los otros, es decir los textbox a la misma altura todos pero en distinta posición (y la posición del siguiente textbox es determinada por la del anterior y así sucesivamente. Deben situarse, donde finaliza el anterior)
Formulario: Biblioteca_Personal

Muchas gracias por la ayuda. Realmente es muy importante poder resolver esto. Si me puedes ayudar te lo agradecería mucho.

1 Respuesta

Respuesta
1

Sinceramente, no entiendo la importancia que tienes en hacerlo mediante código (lo usarás una sola vez) cuando es mucho más rápido y sencillo hacerlo en vista diseño al crear el formulario...

Fíjate que si lo quieres hacer por código, tendrás que saber en que posición (arriba e izquierda) empieza el primer control, ver su ancho, sumarlo, asignarlo a las propiedades arriba e izquierda del segundo, y así con todos. Además, imagino que sólo querrás así de corrido los cuadros de texto, combos... pero no las etiquetas, botones..., con lo que tendrás que ir analizando qué tipo de control se trata para saber si encadenarlo o no...

Lo dicho, demasiado complicado...

Además, para tener un campo a continuación de otro, tienes las distribuciones Hoja de datos, Tabular y Justificado, si creas el formulario con el asistente, o la vista hoja de datos, en la propiedad Vista predeterminada de sus opciones...

Me explico fatal, perdona
Tienes toda la razón en que no tendría sentido hacerlo con código para eso está la vista diseño, vista hoja de datos, etc. pero no es eso lo que necesitba... Intentaré explicarme mejor:

En mi BD tengo el problema en los formularios que fijo una anchura o longitud para los textbox pero a veces si los datos introducidos son muy extensos el ancho se queda corto y no puedo visualizarlos de una pasada y tengo que desplazarme con el cursor a lo largo del cuadro de texto

  O si los hago muy largos para poder visualizarlos queda a veces mucho espacio en blanco.

Como los voy a poner a la misma altura, alineados, puedo asignar medidas fijas en la vista diseño a los textbox para la posición "superior" y "alto"  pero para la anchura, el largo, estoy condicionado por la longitud del texto y esto es una varialble que no puedo controlar hasta "después de actualizar el textbox", una vez he escrito el texto, ya sé cuánto de largo tiene que ser el textbox para poder visualizar los datos a la primera (sin tener que desplazarme por el textbox)

El caso es que tengo un código que me redimensiona en el momento el cuadro de texto en función de la cantidad de palabras que escribo.
Ahora el textbox no tiene una anchura fija que pueda asignar yo en vista diseño, sino que se redimensiona la anchura en función de lo que escribo, se me actualiza la anchura (longitud) en tiempo real cuando escribo. Hasta aquí todo bien.
Por eso si el primer cuadro de texto, no tiene una medida fija... hasta que no añadimos las palabras no puedo saber dónde poner a la izquierda el segundo cuadro de texto porque depende del primero y de su anchura que no la sé hasta que no escriba y actualice.
¿Y todo este rollo por qué... te preguntarás?
Porque la idea es tener los datos justificados en cuadros de texto que se redimensionan cuando escribo y claro el segundo textbox, su posición (me refiero solo a la característica de posición "izquierda" (lo de "superior", "alto" etc. no es problema) pero la posición del textbox de "izquierda" no la puedo fijar porque depende de la anchura del textbox anterior y ésta no la sé porque la anchura no es fija, se redimensiona en función del texto.


A mí se me había ocurrido que como la posición "izquierda" del textbox depende de la anchura del textbox anterior, usáramos el evento "después de actualizar". Porque si sé la anchura, la longitud, una vez he insetado el texto, o sea después de actualizar el cuadro, ya puedo situar el siguiente textbox en función de esa medida. Ese valor sería variable en función claro de la longitud del texto que escribo en el anterior textbox. Luego de alguna manera usaríamos ese dato de la medida para poder posicionar, ahora sí el segundo textbox a la izquierda.
Por eso la necesidad de hacerlo todo con VBA, porque necesito saber primero la longitud del textbox anterior para posicionar el siguiente a la izquierda del primero (todos están en la misma altura alineados horizontalmente) y la longitud del primer textbox viene dada por la cantidad de texto que meto, no es una longitud fija que pueda asignar, solo sé la longitud después de actualizar el cuadro y gracias a un código que redimensiona al escribir el cuadro de texto.

En una pregunta anterior te consulté esto y me comentaste que algo se te había ocurrido. El párrafo en cuestión está al final de la pregunta

Añadir Signos automáticamente al final del texto

en las respuestas del 5 de Junio.

Espero de verdad que lo de "después de actualizar" o alguna otra idea pueda darte la inspiración divina para resolver esto. Debería quedar así:

Disculpa el rollo :)

Esta es la idea que tenía:

Me.Campo2.Top = Me.Campo1.Top
Me.Campo2.Left = Me.Campo1.Left + Me.Campo1.Width
Me.Campo3.Top = Me.Campo2.Top
Me.Campo3.Left = Me.Campo2.Left + Me.Campo2.Width

Y así con el resto. Es decir, vas poniendo el campo 2 (Altura e izquierda) en función del campo 1 (altura e izquierda+ancho), el campo 3 en función del 2 y así sucesivamente...

Pero ten en cuenta que los cambios en el diseño no se te guardarán, lo que significa que al abrir de nuevo el formulario tendrás los controles donde los tengas situados al diseñar el form.

Hola

Solo puedo decirte que es genial, chapó porque realmente me has solucionado el problema.

Qué ingenioso, a mí nunca se me hubiera ocurrido la verdad y es que lo aparentemente sencillo es lo realmente difícil. Mil, mil gracias

1. Estas líneas que me indicas en qué evento crees que es mejor ponerlas? al cargar formulario? al activar formulario? en otro?

Un detalle... si quisiera sumar medio centímetro más de separación entre los campos cómo podría ponerlo en la línea:

Me.Campo2.Left = Me.Campo1.Left + Me.Campo1.Width + (0.5 cm)

A la espera de tu respuesta de nuevo mil gracias

Pues el código, por lo que dices antes (lo de que le ajustas el tamaño según el contenido), yo lo pondría en "Despues de actualizar" de cada cuadro de texto.

El tamaño de los controles se mide en twips, por lo que tendrás que sumar el número de twips equivalente a ese medio centímetro (567 twips=1cm creo recordar, pero puedes buscarlo en google para asegurar)

Hola

Sí tenías razón, 1 cm equivale a 567 twips o sea me medio centímetro serían 283.5 twips... pero cómo sumo eso en la líneas de código, ¿así?

Me.Campo2.Left = Me.Campo1.Left + Me.Campo1.Width + (283.5 twips)

Evindentemente no me funciona, ya me dices y muy agradecido

Simplemente:

Me.Campo2.Left = Me.Campo1.Left + Me.Campo1.Width + 283.5

Pues muchas gracias. Te agradezco en el alma que me hayas resuelto esta consulta, porque realmente me ha venido de maravilla.

Muy, muy agradecido

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas