[RESUELTO] Redimensionar un texbox

Discute sobre las herramientas de la base de datos
Responder
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

[RESUELTO] Redimensionar un texbox

Mensaje por Longi »

Buenas de nuevo!
Aunque prometí que estudiaría (nótese la diferencia con aprendería) algo de programación, aquí me tenéis dando guerra de nuevo.
Encontré una macro que funciona a la perfección para aquello para lo que se hizo, que es cambiar el tamaño de un formulario. Lo que no soy capaz es conseguir adaptarla a cambiar el tamaño de un textbox. Igual es que no se puede, pero visto lo que me habéis hecho ver, cualquier cosa es posible (o casi), lo único es saber cómo (el pequeño detalle).
La macro es:

Código: Seleccionar todo

Sub ReSizeForm(Event As Object)
Dim Form As Object
Dim FormDoc As Object
Dim Controller As Object
Dim Frame As Object
Dim ContainerWindow As Object
Dim Size As New com.sun.star.awt.Size
    Doc = StarDesktop.CurrentComponent
    Form = Doc.DrawPage.Forms.GetByIndex(0)
	FormDoc=Form.Parent.Parent
	Controller=ThisComponent.getCurrentController("RESUMEN")
	Frame=Controller.Frame
	ContainerWindow=Frame.ContainerWindow
	Size.Width=ContainerWindow.Size.Width/2
	Size.Height=ContainerWindow.Size.Height/2
	ContainerWindow.setPosSize(,,Size.Width,Size.Height,15)
End Sub
Como dije, me gustaría poder aplicarla a un campo, y no a todo el formulario
Un saludo!
Última edición por SLV-es el Sab Mar 29, 2014 1:37 am, editado 3 veces en total.
Razón: Aplicar correctamente las etiquetas [CODE] [/CODE]. Agregar espacio entre [RESUELTO] y Redimensionar
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Avatar de Usuario
SLV-es
Mensajes: 4894
Registrado: Jue Ago 26, 2010 1:25 am
Ubicación: España
Contactar:

Re: Redimensionar un texbox

Mensaje por SLV-es »

Suponemos la librería Standard, y el formulario Dialog1, que contiene un control tipo texto llamado CampoTexto1:

Código: Seleccionar todo

Sub RedimensionarControlTexto()
	dim oDlg as object, oDlgLib as object, oControls as object
	dim oTxt as object
	
	oDlgLib = dialogLibraries.getByName("Standard") ' Cargo la librería
	oDlg = CreateUNODialog(oDlgLib.getByName("Dialog1")) ' Cargo el diálogo
	
	oControls = oDlg.Model ' me da acceso a los distintos controles por su nombre
	
	oTxt = oControls.getByName("CampoTexto1") ' Accedo al control por su nombre
	
	msgbox "El control CampoTexto1 tiene Alto = " & oTxt.Height & " y Ancho = " & oTxt.Width
	
       ' Cambio el alto y el ancho
	oTxt.Height = 200
	oTxt.Width = 200
	
	msgbox "Ahora el control CampoTexto1 tiene Alto = " & oTxt.Height & " y Ancho = " & oTxt.Width	
	
	oDlg.Execute() ' Muestro el diálogo con las dimensiones del control cambiadas
	
	msgbox "Hecho"
	
End Sub
Ale, a estudiar !!! ;)
+info en la web "no oficial" dedicada a OpenOffice en Español
AOO 4.1.2 y LibO 4.4.6 en W10 y en Lliurex
No respondo mensajes privados sobre AOO, por favor, utiliza el foro para tus preguntas
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Redimensionar un texbox

Mensaje por Longi »

Buenas!
Gracias por la respuesta, bastante rápida, no como mis respuestas.
He cometido un pequeño error, y es que el título no termina de aclarar bien lo que querría, que por otra parte creo que es muy complejo.
Veamos:
Tengo un informe, con un campo de texto (tipo memo o nota) de tamaño variable, según el registro de que se trate que llamo "RESUMEN"
He conseguido después de mucho trastear, poder variar el tamaño, pero manualmente dentro de la macro, pero quería que los cambios se hiciesen de forma no manual:

Código: Seleccionar todo

Sub CambioTamaño()
Dim Doc As Object
Dim Shape as Object
Dim I as integer

Dim Point As New com.sun.star.awt.Point
Dim Size As New com.sun.star.awt.Size

Doc = ThisComponent
 
For i = 0 to Doc.DrawPage.Count - 1
  Shape = Doc.DrawPage(i)
  If HasUnoInterfaces(Shape, "com.sun.star.drawing.XControlShape") Then
    If Shape.Control.Name = "RESUMEN" Then
       Exit FOR
    End If
  End If
Next  
Point.x = 1000
Point.y = 5000
Size.Width =[color=#FF0000] 25000[/color]
Size.Height = [color=#FF0000]6000[/color]
 
Shape.Size = Size
Shape.Position = Point
End Sub 
Lo que a mi me gustaría es el poder cambiar el valor en rojo por una función, de tal manera que el valor dependa del interior del text box(cantidad de caracteres y tamaño de la fuente, calculando la superficie necesaria, y no más, pero tampoco menos). Con esa 'tontería' tendríamos un autoextensible en el informe, que en realidad es lo que llevo persiguiendo desde hace tiempo.
Ya me direis si es una 'tontería', sencillo, complicado o imposible.

Un saludo!
Última edición por SLV-es el Sab Mar 29, 2014 1:38 am, editado 1 vez en total.
Razón: Aplicar correctamente las etiquetas [CODE] [/CODE]
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Avatar de Usuario
SLV-es
Mensajes: 4894
Registrado: Jue Ago 26, 2010 1:25 am
Ubicación: España
Contactar:

Re: Redimensionar un texbox

Mensaje por SLV-es »

No creo que te sea difícil:

- Crear una macro que redimensione el textbox, similar a la que te indiqué, en función del número de caracteres que contiene el textbox.
- Llamar a esa macro en el evento Tecla pulsada, o en el evento Texto modificado del textbox

Cada vez que se modifique o pulse una tecla en el contenido del textbox, se llamará a la función que calculará el contenido del textbox, y lo redimensionará.
Con unas pocas pruebas supongo que podrás determinar el "factor" de dimensionamiento según la cantidad de texto.
Recomiendo fijar unas dimensiones mínimas, y que a partir de x longitud de texto, se redimensione.

Si por ejemplo, para 500 carácteres tienes el tamaño fijo en 400x300:

Código: Seleccionar todo

factor = num_caracteres / 500
if factor < 1 then factor=1

oTxt.Height = 400*factor



Saludos
+info en la web "no oficial" dedicada a OpenOffice en Español
AOO 4.1.2 y LibO 4.4.6 en W10 y en Lliurex
No respondo mensajes privados sobre AOO, por favor, utiliza el foro para tus preguntas
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Redimensionar un texbox

Mensaje por fornelasa »

Hola...
Otra opción, si he entendido bien, según yo debería ser algo similar a esto:
Saludos, Federico.
Adjuntos
AutoAjustarTexto.ods
Auto Ajustar Texto
(11.31 KiB) Descargado 475 veces
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
ck-iridium
Mensajes: 157
Registrado: Jue Ene 17, 2013 9:35 pm
Ubicación: Valencia - España

Re: Redimensionar un texbox

Mensaje por ck-iridium »

Hola, revivo este post ya que yo no obtengo solución alguna.

En el ejemplo de arriba, parece ser que funciona muy bien, pero no sé cómo implementarlo a un formulario.

Me gustaría utilizar dicha macro para que cuando se carguen los datos en el formulario, algunos campos se ajusten a su contenido.

Por ejemplo:

Estimado Sr. [ Juan______________] [ Lopez___________], le comunicamos que en el presente . . . .

En cambio, un formulario correcto sería redimensionando su longitud:

Estimado Sr. [ Juan ] [ Lopez ], le comunicamos que en el presente . . . .

He intentado usar la macro, sin diálogos, y poniéndola en los campos que quiero redimensionar, pero ni funciona.

Alguien sabría como conseguir eso?

Saludos!
OpenOffice 4.0.1 en Windows 7 Ultimate
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Redimensionar un texbox

Mensaje por Longi »

Bueno....
Hace mucho, mucho tiempo que no miro para el foro, así que no he sabido que había esta pregunta.
La primera posibilidad que se me ocurre es la de organizar un campo en la consulta que haces de origen, en la que usarías texto: 'Estimado Sr'||CampoNombre||' '||Campoapellidos||' le comunicamos por la presente.....'
Esto te sirve si la frase en cuestión no la haces para que sea toda la carta, y lo meterías todo como un único campo.
Hay otras tres posibilidades que yo vea, todas con ventajas e inconvenientes, que pueden ser importantes según cómo o cual sea tu forma de trabajar. La primera ya la expuse en otro hilo, que se titulaba Campo autoextensible en informe 2. (si resulta confuso, estoy intentando hacer un 'tutorial' paso a paso para hacerlo).
La otra es combinando correspondencia desde f4 y usando como fuente la consulta que empleas (estoy urgando a ver si lo puedo automatizar).
La tercera es aplicando la macro que pongo abajo y que alguien tendrá que mejorar: uso el tamaño de letra del formulario sin modificarla, de tal manera que son 90 los caracteres que caben en un campo de longitud de 17500, así que si variamos la letra ya se desconfigura todo. Ah!, es un híbrido de dos cosas que me mandaron Fornelasa y SLV.
Hay que tener en cuenta también que la he preparado para que el campo Texto1 empiece en Point.x = 2000
Point.y = 1000 (es decir, que empieza a 2cm del borde izquierdo del papel y 1cm del borde superior).
Sirve para campos tipo nota (LONGVARCHAR), pero si usas intros, no te los tiene en cuenta para calcular las filas (es decir, la altura final ) y te lo vuelve a descuadrar todo. Además no justifica el texto.
Lo estoy usando para informes, pero no termino de afinar el código (en realidad no sé cómo hacer, tan solo hago el afamado método del ensayo y error)
A ver si sirve:

Código: Seleccionar todo

 Sub CambioTamano1(Evento)
Dim Doc As Object
Dim Shape as Object
Dim I as integer
Dim Texto1 as string
Dim Texto2 as string
Dim Texto3 as string
Dim oForm as object
Dim Form as Object
const w = 90
const f = 35
Dim Size As New com.sun.star.awt.Size
Dim Point As New com.sun.star.awt.Point
oForm = Evento.Source.Parent
Form = oForm.getByName("Formulario")
'--------------------------------------------------------------------------------------------------------
Texto1= Form.GetByName ("Texto1").Text
Doc = ThisComponent
For i = 0 to Doc.DrawPage.Count - 1
Shape = Doc.DrawPage(i)
If HasUnoInterfaces(Shape, "com.sun.star.drawing.XControlShape") Then
If Shape.Control.Name = "Texto1" Then
Exit FOR
End If
End If
Next
l=len(Texto1)
h = (cInt( l / w )+1)*500
if l < 90 then
   j=l*(17500/90)
   Else j=17500 
end if

Size.Width = j
Size.Height = (cInt( l / w )+1)*500
Shape.Size = Size
Point.x = 2000
Point.y = 1000
Shape.Position = Point
End Sub
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Avatar de Usuario
ck-iridium
Mensajes: 157
Registrado: Jue Ene 17, 2013 9:35 pm
Ubicación: Valencia - España

Re: Redimensionar un texbox

Mensaje por ck-iridium »

Hola Longui

Pues lamentablemente no hago funcionar la macro. :(

En mi caso, tengo un formulario en writer que adquiere los datos de una consulta.

La carta personalizada incluye campos como NOMBRE APELLIDOS y alguno más, los cuales están insertados entre en texto. Pues cuando paso de registro, se auto completan los datos que necesito.

El problema está en que los campos tienen un ancho fijo, y viendo el ejemplo de Fornelasa, funciona bajo Calc y cuando escribes dentro del campo.

Yo quiero que el campo en se redimensione según paso de registro, no creo que sea difícil, pero claro yo no sé hacerlo.

Saludos!
OpenOffice 4.0.1 en Windows 7 Ultimate
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Redimensionar un texbox

Mensaje por Longi »

Lo siento, pero ando un poco liado.
Cuando haya terminado el tutorial lo cuelgo, aunque no serán más que indicaciones que hago yo, no que sea la verdad absoluta.

Un saludo!
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
RMG
Mensajes: 3879
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: Redimensionar un texbox

Mensaje por RMG »

Hola,

Sobre este tema y como opinar no cuesta nada :D , te has planteado lo fácil (si es que se puede hacer), cambiar el diseño de la carta, dejar dos lineas para esos campos y continuar con el resto, incluso una sola, concatenando los campos en una consulta.

Saludos
OpenOffice 4.1.15 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
Avatar de Usuario
ck-iridium
Mensajes: 157
Registrado: Jue Ene 17, 2013 9:35 pm
Ubicación: Valencia - España

Re: Redimensionar un texbox

Mensaje por ck-iridium »

Hola RMG

Pues claro que no, no tengo ni idea de las posibilidades que ofrece AOO, estoy "pez"!

Pues inmediatamente me pongo a buscar el cómo concatenar 2 campos y así mostrarlos juntos, pero creo que el problema lo tendría casi igual, ya que dichos campos aun siendo concatenados tendrían un ancho fijo no? porque si no es así... creo que valdría como solución.

De momento sigo como lo hacía antes. Poniendo 1 campo aislado por fila y el texto después.

A ver qué encuentro.

P.D: Cumplo 100 mensajes! :lol:

Saludos!
OpenOffice 4.0.1 en Windows 7 Ultimate
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Redimensionar un texbox

Mensaje por fornelasa »

Aquí un archivo con una posible opción.
Debemos encontrar la constante para un tipo de letra determinado, en este caso para un tipo de letra Arial, Regular, 12 que el control del archivo tiene es de 200 puntos aproximadamente.
Saludos, Federico.
Adjuntos
AutoAjustarTexto.odt
Ajustar texto
(11.63 KiB) Descargado 431 veces
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
ck-iridium
Mensajes: 157
Registrado: Jue Ene 17, 2013 9:35 pm
Ubicación: Valencia - España

Re: Redimensionar un texbox

Mensaje por ck-iridium »

Waw FORNELASA, GRACIAS!

Funcionar funciona, aunque no perfecto, pero es un avance!

El problema viene en los acontecimientos, no me sirve ninguno. AL pasar de registros, ya que es una Carta convertida en formulario, al pasar de registro, no se redimensiona a menos que haga un click dentro del campo.

No hay manera de que la macro actúe sin tener que hacer click en el campo en cuestión?

Yo voy a ir probando, que con esto creo que lo solucionare.

Muchas gracias de nuevo, ya os cuento como va funcionando.

Saludos!
OpenOffice 4.0.1 en Windows 7 Ultimate
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Redimensionar un texbox

Mensaje por fornelasa »

Hola ck-iridium,
El control en cuestión tienen varios eventos, sugiero probar con el evento "modificado".
Si, coincido contigo, hay que hacer pruebas de ensayo y error hasta que quede bien definido.
Saludos, Federico.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
ck-iridium
Mensajes: 157
Registrado: Jue Ene 17, 2013 9:35 pm
Ubicación: Valencia - España

Re: Redimensionar un texbox

Mensaje por ck-iridium »

Hola Federico,

Pues vamos a ver, he inventado un método, que realmente no es del todo funcional, pero al menos hace lo que quiero y de una manera rápida.

Con la macro que me has proporcionado, la he metido en un campo, Nombre. Luego copie la macro y le puse un nombre distinto, para así tener 2, claro que cambié lo siguiente, que supongo hace relación al orden de los campos.

Código: Seleccionar todo

thiscomponent.getdrawpage.getbyindex(0)
thiscomponent.getdrawpage.getbyindex(1)
thiscomponent.getdrawpage.getbyindex(2)
Así hasta tener 3 campos con su macro.

Me pareció un lio, y opté por hacer una macro la cual, auto redimensiona todos los controles a la vez, y la verdad, que ha funcionado.

El problema venia cuando había que refrescar dicha macro, la cual redimensiona todos los campos. Entonces he creado un botón, que al pulsarlo, ejecuta la macro en cuestión, así cada vez que pase registro, le doy al botón. Y los redimensiona.

El acabado final no es muy bueno ya que algunos textos al contener “i”, la cual ocupa menos proporción, pues deja espacios en blanco al final del campo.
He intentado ajustar el 200, a un poco más o poco menos, pero como el texto va variando pues es muy complicado dejarlo clavado para todo.

Código: Seleccionar todo

Sub adjustSize_Text1()
oCtrl = thiscomponent.getdrawpage.getbyindex(0)
txt = oCtrl.control.currentValue
l = (len(txt) + 1)
h = cInt( l *190 )
size = oCtrl.Size
size.Width = h
oCtrl.setSize(size)

oCtrl2 = thiscomponent.getdrawpage.getbyindex(1)
txt = oCtrl2.control.currentValue
l = (len(txt) + 1)
h = cInt( l * 215 )
size = oCtrl2.Size
size.Width = h
oCtrl2.setSize(size)

oCtrl3 = thiscomponent.getdrawpage.getbyindex(2)
txt = oCtrl3.control.currentValue
l = (len(txt) + 1)
h = cInt( l * 200 )
size = oCtrl3.Size
size.Width = h
oCtrl3.setSize(size)
End Sub
Subo la muestra, solo hay que conectar el formulario a una fuente de datos para que cargue algun dato de ejemplo.

En fin, mañana cuando llegue a la oficina intentaré pulirlo algo más.

Gracias sinceras,

Saludos!
Adjuntos
AutoAjustarCampos.odt
(12.49 KiB) Descargado 332 veces
OpenOffice 4.0.1 en Windows 7 Ultimate
RMG
Mensajes: 3879
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: Redimensionar un texbox

Mensaje por RMG »

Hola,

Si puedes asignar la macro al evento al cambiar registro. Muestra la barra de herramientas diseño de formulario y accedes a sus propiedades, después, puedes visualizar también la barra navegador de formularios para pasar de un registro a otro.

Subo adjunto modificado. Cambia la fuente de datos por la tuya.

Saludos
Adjuntos
AutoAjustarCampos.odt
(11.39 KiB) Descargado 392 veces
OpenOffice 4.1.15 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
Avatar de Usuario
ck-iridium
Mensajes: 157
Registrado: Jue Ene 17, 2013 9:35 pm
Ubicación: Valencia - España

Re: Redimensionar un texbox

Mensaje por ck-iridium »

Yeah, Ramón

Pues yo sabía que se podía, y recordaba haber visto ese evento, pero no sabía dónde estaba. Entré en Herramientas / Personalizar / Eventos... pero ahí no era el sitio idóneo :mrgreen:

Pues fenomenal, ya que ahora si esta automatizado del todo, incluso no tengo que modificar mi antiguo formulario con macros!

Gracias a todos! "como siempre"

Saludos!
OpenOffice 4.0.1 en Windows 7 Ultimate
Avatar de Usuario
ck-iridium
Mensajes: 157
Registrado: Jue Ene 17, 2013 9:35 pm
Ubicación: Valencia - España

Re: Redimensionar un texbox

Mensaje por ck-iridium »

Una pregunta acerca de la macro de Federico.

¿Es posible usar otra variable como GetByName?

Código: Seleccionar todo

thiscomponent.getdrawpage.getbyindex(0)
Por esto otro

Código: Seleccionar todo

thiscomponent.getdrawpage.getbyname(Nombre)
Estoy probando y no me aclaro.

Saludos!
OpenOffice 4.0.1 en Windows 7 Ultimate
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Redimensionar un texbox

Mensaje por fornelasa »

Un posible ejemplo:

Código: Seleccionar todo

Sub Ejemplo()
tFormas = ThisComponent.getDrawPage
oForma = tFormas.GetForms.GetByName("Formulario") 'Se supone que todos los "dibujos" están dentro de "Formulario"
oCtrl = oForma.GetByName("Campo de texto 1")   ' Es decir: el nombre que corresponde o está en Campo de control | Nombre

'Para obtener el texto/nombre del control
Nombre = oCtrl.Name
End Sub
Saludos, Federico.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
ck-iridium
Mensajes: 157
Registrado: Jue Ene 17, 2013 9:35 pm
Ubicación: Valencia - España

Re: Redimensionar un texbox

Mensaje por ck-iridium »

Ok, ya voy entendiendo mucho mejor Basic.

De esta forma puedes asignar mucho mas facil los controles.

Muchas gracias Federico.

Saludos.
OpenOffice 4.0.1 en Windows 7 Ultimate
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Redimensionar un texbox

Mensaje por fornelasa »

:super:
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Redimensionar un texbox

Mensaje por Longi »

Buenas!
Esta vez el retraso ha sido por motivos técnicos
Cuando expliqué la macro, evidentemente me dejé cosas en el tintero: Yo la asocio al evento 'al cargar el formulario', y me funciona con las limitaciones de cálculo de espacio por las letras i,las letras m, los espacios y los puntos y aparte, por lo demás funciona bien, pero teniendo en cuenta que yo abro un informe de cada vez, es decir, para cada registro. Para hacerlo sobre consultas que saquen varios registros es necesario hacerlo como te han indicado.
Por cierto! Fornelasa lo dejó mucho más elegante que lo que hago yo (que es un auténtico barullo), aunque en definitiva viene a ser lo mismo.
Sin embargo, en el caso de que tengas un nombre muy, muy, muy largo y unos apellidos también muy, muy, muy largos, posiblemente veas cómo el campo se te sale de la zona de la hoja y se te vaya por los márgenes(haz alguna prueba y nos lo cuentas)
Todo es cuestión de ir afinando en el diseño, mientras no nos lo arreglen en las versiones siguientes los desarrolladores, así como lo de poder justificar el texto, ya que si no queda todo bastante poco profesional, aunque como ves, en base se puede hacer de todo, solo hace falta programarlo. ¡Menos mal que tenemos a gente competente en el foro!
Voy a mantener el hilo abierto para seguir poniendo sugerencias sobre el mismo tema, ya que considero que esto puede seguir dando juego.
Un saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Redimensionar un texbox

Mensaje por mauricio »

Yo sería de la opinión de darlo por RESUELTO, pues así ha sido... de todos modos el tema sigue abierto...
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Redimensionar un texbox

Mensaje por Longi »

Buenas!

Después de unas cuantas pruebas creo que he conseguido lo buscado: Podemos variar el tamaño de un campo de texto en función de su contenido (independientemente de la cantidad de texto) y del tamaño o formato de la letra, sin tener que hacer cálculos específicos para cada tipo de letra.
En el caso de que queramos modificar el tamaño para un campo tipo "nombre", "dirección" o similares, que nos ocupe menos de una línea del informe, podremos usar el siguiente código:(Tener en cuenta que lo he aplicado en un subformulario hecho dentro del propio informe, y aplicando la macro al evento tras el cambio de registro de datos del subformulario)

Código: Seleccionar todo

Sub ModificarTamano (Event as object)
  
  Dim oShape 
  Dim oSize 
  Dim oForm as object
  Dim Form as Object
  Dim Nombre as string
  oForm = Event.Source.Parent
  Form = oForm.getByName("Subformulario")
  GlobalScope.BasicLibraries.LoadLibrary("Tools") 
  Model = Form.GetByName("Nombre")
  Controller = ThisComponent.GetCurrentController()
  sizeCtl = Controller.GetControl(Model)
  sizePeer = sizeCtl.Peer
  oShape = GetControlShape(ThisComponent, "Nombre") 
  oSize = oShape.getSize(N)
  oPreferredSize = sizeCtl.PreferredSize
  sizeCtl.SetOutputSize(oPreferredSize)
  sizeCtl.SetPosSize(0, 0, oPreferredSize.Width, oPreferredSize.Height, 26)
  ShapeHeightRatio = sizeCtl.Size.Height
  ShapeWidthtRatio = oShape.Size.Width / sizeCtl.Size.Width
  oPreferredSize.Height = (oPreferredSize.Height * ShapeHeightRatio)*0.8 ' El 0.8 facilita la alineación con el resto del texto
  oPreferredSize.Width = (oPreferredSize.Width * ShapeWidthtRatio)+100 ' El 100 da un poco más de margen a la derecha del campo
  oShape.SizeProtect = False
  oShape.SetSize(oPreferredSize)
End Sub
Con esto conseguimos modificar tanto la longitud como la altura del campo, ajustándose al contenido. Hice variaciones tanto en altura como en longitud para que se adecuasen mejor al texto que los rodea (usé un factor del 80% para la altura y sumé 100 unidades a la longitud).

Si lo que queremos es variar el tamaño de un campo multilínea, mantendremos fijo el ancho y variaremos la altura en función del contenido del campo (Exactamente esto es lo que buscaba desde un principio con lo del 'campo autoextensible'):

Código: Seleccionar todo

Sub ModificarTamano2 (Event as object)
  
  Dim oShape 
  Dim oSize 
  Dim oForm as object
  Dim Form as Object
  Dim Nombre as string
  oForm = Event.Source.Parent
  Form = oForm.getByName("Subformulario")
  Model = Form.GetByName("Texto1")
  Controller = ThisComponent.GetCurrentController()
  sizeCtl = Controller.GetControl(Model)
  sizePeer = sizeCtl.Peer
  oShape = GetControlShape(ThisComponent, "Texto1") 
  oSize = oShape.getSize()
  oPreferredSize = sizeCtl.PreferredSize
  sizeCtl.SetOutputSize(oPreferredSize)
  sizeCtl.SetPosSize(0, 0, oPreferredSize.Width, oPreferredSize.Height, 26)
  ShapeWidthtRatio = oShape.Size.Width / sizeCtl.Size.Width
  ShapeHeightRatio = oShape.Size.Width /sizeCtl.Size.Width
  oPreferredSize.Height = (oPreferredSize.Height * ShapeHeightRatio)+400
  oPreferredSize.Width = oSize.Width
  oShape.SizeProtect = False
  oShape.SetSize(oPreferredSize)
End sub
En este caso añadí 400 a la altura, para que quede como un párrafo distinto, es decir, para separar del resto del texto en altura.

En el primer código enviado el campo de texto se llama 'nombre', mientras que en el segundo se llama 'Texto1'.
Adjunto la base de datos en la que lo hice. Además van otros dos ejemplos de otras posibilidades para trabajar con informes.

Un saludo!

Ah!, lo marco como resuelto, aunque mi siguiente pregunta, que haré en otro hilo...: Hacer justificación en un campo de texto (ya sé que no lo admite, pero a lo mejor a alguien se le ocurre algo.)
Adjuntos
AJUSTAR TAMAÑOS.rar
(81.96 KiB) Descargado 294 veces
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Avatar de Usuario
SLV-es
Mensajes: 4894
Registrado: Jue Ago 26, 2010 1:25 am
Ubicación: España
Contactar:

Re: [RESUELTO]Redimensionar un texbox

Mensaje por SLV-es »

Gracias por compartir !!! :bravo:
+info en la web "no oficial" dedicada a OpenOffice en Español
AOO 4.1.2 y LibO 4.4.6 en W10 y en Lliurex
No respondo mensajes privados sobre AOO, por favor, utiliza el foro para tus preguntas
RMG
Mensajes: 3879
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: [RESUELTO]Redimensionar un texbox

Mensaje por RMG »

Gracias por el aporte. :bravo: :bravo:
OpenOffice 4.1.15 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: [RESUELTO] Redimensionar un texbox

Mensaje por Longi »

Por cierto, los honores son del voluntario bobban (foro en Inglés), y Pitonyak.
Tras mucho trastear, mezclando macros de ambos conseguí el efecto deseado, aunque seguro que se puede afinar bastante, así que si alguno se anima.....

Un saludo!
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Avatar de Usuario
ck-iridium
Mensajes: 157
Registrado: Jue Ene 17, 2013 9:35 pm
Ubicación: Valencia - España

Re: [RESUELTO] Redimensionar un texbox

Mensaje por ck-iridium »

Heys!! No lo habia visto!

Muchas gracias por share! Voy a probarlo!

P.D: Probado!! Que pasada!! :alarm:

Saludos!
OpenOffice 4.0.1 en Windows 7 Ultimate
RMG
Mensajes: 3879
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: [RESUELTO] Redimensionar un texbox

Mensaje por RMG »

Hola,

Una cosa a tener en cuenta sobre este aporte, Si un campo se repite en el documento, la macro solo actúa sobre el primer campo, por lo que el segundo y así en sucesivos, hay que renombrarlos, ejemplo. Si el campo se llama nombre al segundo se le puede poner nombre1, al tercero nombre2 etc. por supuesto el origen del dato siempre será nombre.

Saludos
OpenOffice 4.1.15 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
Responder