Trabajando con formularios
Los formularios nos permiten interactuar con el usuario por medio de controles que son objetos con características especiales y la capacidad de poder asociarles la ejecución de macros. El formulario y la mayoría de los controles tienen propiedades especiales para enlazarse, visualizar y controlar bases de datos, aunque se pueden usar sin ellas.
El uso de formularios permite automatizar aun más múltiples tareas; también pueden servir para ayudar al usuario con la manipulación de datos, sobre todo, a los que tienen poca experiencia con la hoja de calculo, ya que nos permite convertir una hoja de Calc en una nueva y completamente personalizada interfaz de usuario.
Asumimos que sabes agregar los controles a la interfaz del usuario y manipular sus propiedades en tiempo de diseño; aquí veremos como manipular las propiedades más importantes de estos, en tiempo de ejecución, es decir, con código OOo Basic.
Contents
- 1 Formularios (Forms)
- 2 Etiquetas (Label)
- 3 Cuadros de texto (TextBox)
- 4 Casilla de verificación (CheckBox)
- 5 Campo formateado (FormattedField)
- 6 Botón de comando (CommandButton)
- 7 Botón de opción (OptionButton)
- 8 Cuadro de lista (ListBox)
- 9 Cuadro combinado (ComboBox)
- 10 Botón de selección (SpinButton)
- 11 Barra de desplazamiento (ScrollBar)
- 12 Otros controles
- 12.1 Botón gráfico (ImageButton)
- 12.2 Control de imagen (ImageControl)
- 12.3 Selección de archivo (FileSelection)
- 12.4 Campo de fecha (DateField)
- 12.5 Campo de hora (TimeField)
- 12.6 Campo numérico (NumericField)
- 12.7 Campo moneda (CurrencyField)
- 12.8 Campo enmascarado (PatternField)
- 12.9 Cuadro de grupo (GroupBox)
- 12.10 Control de tablas (TableControl)
- 12.11 Barra de navegación
Formularios (Forms)
Los formularios y sus controles se colocan sobre la capa de dibujo, por lo que a través de esta hay que acceder a ellos como en el siguiente ejemplo donde mostramos los nombres de los formularios existentes en la hoja activa.
Sub Formularios1() Dim oDoc As Object Dim oHojaActiva As Object Dim oPaginaDibujo As Object Dim oFormularios As Object Dim co1 As Integer 'El archivo desde donde se llama esta macro oDoc = ThisComponent 'La hoja activa oHojaActiva = oDoc.getCurrentController.getActiveSheet() 'La página de dibujo oPaginaDibujo = oHojaActiva.getDrawPage() 'Todos los formularios oFormularios = oPaginaDibujo.getForms() 'Iteramos en cada uno mostrando su nombre For co1 = 0 To oFormularios.getCount() - 1 MsgBox oFormularios.getByIndex(co1).getName() Next co1 End Sub
Como en el ejemplo anterior, puedes acceder a un formulario por su índice o por su nombre, en los dos casos el formulario debe de existir, debes de validarlo como en.
Sub Formularios2() Dim oDoc As Object Dim oHojaActiva As Object Dim oPaginaDibujo As Object Dim oFormularios As Object Dim iNum As Integer Dim sNombre As String 'El archivo desde donde se llama esta macro oDoc = ThisComponent 'La hoja activa oHojaActiva = oDoc.getCurrentController.getActiveSheet() 'La página de dibujo oPaginaDibujo = oHojaActiva.getDrawPage() 'Todos los formularios oFormularios = oPaginaDibujo.getForms() iNum = 1 'Nos aseguramos de que existe el número de formulario If iNum<nowiki> < </nowiki>oFormularios.getCount() Then MsgBox oFormularios.getByIndex(iNum).getName() End If sNombre = "Directorio" 'Nos aseguramos de que existe el nombre del formulario If oFormularios.hasByName(sNombre) Then MsgBox oFormularios.getByName(sNombre).getName() End If End Sub
Puedes cambiar el nombre del formulario.
Sub Formularios3() Dim oDoc As Object Dim oHojaActiva As Object Dim oPaginaDibujo As Object Dim oFormularios As Object Dim oFormulario As Object oDoc = ThisComponent oHojaActiva = oDoc.getCurrentController.getActiveSheet() oPaginaDibujo = oHojaActiva.getDrawPage() oFormularios = oPaginaDibujo.getForms() oFormulario = oFormularios.getByIndex(0) MsgBox oFormulario.getName() 'Cambiamos el nombre del primer formulario oFormulario.setName("Nuevo Formulario") End Sub
Puedes cambiar el origen de datos del formulario.
Sub Formularios4() Dim oDoc As Object Dim oHojaActiva As Object Dim oPaginaDibujo As Object Dim oFormularios As Object Dim oFormulario As Object oDoc = ThisComponent oHojaActiva = oDoc.getCurrentController.getActiveSheet() oPaginaDibujo = oHojaActiva.getDrawPage() oFormularios = oPaginaDibujo.getForms() oFormulario = oFormularios.getByIndex(0) MsgBox oFormulario.DataSourceName 'Cambiamos la fuente de datos oFormulario.DataSourceName = "Directorio" End Sub
Aquí debes de tener algunas consideraciones importantes; los nombres de las fuentes de datos, son nombres de bases de datos registradas en OOo y ya vistas en el capitulo de Bases de datos, por lo que no las repetiremos aquí, si la fuente de datos no existe, no te dará ningún error, pero claro, no obtendrás nada de datos, ten cuidado al cambiar la fuente de datos, no solo el formulario puede estar vinculado con esta, los controles del formulario, también pueden estar vinculados a ella, por lo que perderás cualquier vinculo a los datos, lo más común, es enlazar una vez al inicio de la configuración de un formulario o para corregir desajustes realizados por los usuarios. Además de la fuente de datos puedes establecer el tipo de contenido y el contenido.
Sub Formularios5() Dim oDoc As Object Dim oHojaActiva As Object Dim oPaginaDibujo As Object Dim oFormularios As Object Dim oFormulario As Object oDoc = ThisComponent oHojaActiva = oDoc.getCurrentController.getActiveSheet() oPaginaDibujo = oHojaActiva.getDrawPage() oFormularios = oPaginaDibujo.getForms() oFormulario = oFormularios.getByIndex(0) 'Establecemos la base de datos fuente oFormulario.DataSourceName = "Directorio" 'Como origen una tabla oFormulario.CommandType = 0 'El nombre de la tabla oFormulario.Command = "tblCiudades" End Sub
En el siguiente ejemplo establecemos una consulta como origen de datos.
Sub Formularios6() Dim oDoc As Object Dim oHojaActiva As Object Dim oPaginaDibujo As Object Dim oFormularios As Object Dim oFormulario As Object oDoc = ThisComponent oHojaActiva = oDoc.getCurrentController.getActiveSheet() oPaginaDibujo = oHojaActiva.getDrawPage() oFormularios = oPaginaDibujo.getForms() oFormulario = oFormularios.getByIndex(0) 'Establecemos la base de datos fuente oFormulario.DataSourceName = "Directorio" 'Como origen una consulta oFormulario.CommandType = 1 'El nombre de la consulta oFormulario.Command = "qryCiudades" End Sub
Por ultimo, podemos establecer un comando SQL como origen de datos.
Sub Formularios7() Dim oDoc As Object Dim oHojaActiva As Object Dim oPaginaDibujo As Object Dim oFormularios As Object Dim oFormulario As Object oDoc = ThisComponent oHojaActiva = oDoc.getCurrentController.getActiveSheet() oPaginaDibujo = oHojaActiva.getDrawPage() oFormularios = oPaginaDibujo.getForms() oFormulario = oFormularios.getByIndex(0) 'Establecemos la base de datos fuente oFormulario.DataSourceName = "Directorio" 'Como origen una instrucción SQL oFormulario.CommandType = 2 'La instrucción SQL oFormulario.Command = "SELECT * FROM tblContactos" End Sub
Todas las precauciones y particularidades vistas en las bases de datos, son aplicables a los formularios, por lo que te recomiendo las tengas siempre presentes.
Puedes agregar nuevos formularios a la colección.
Sub Formularios8() Dim oDoc As Object Dim oHojaActiva As Object Dim oPaginaDibujo As Object Dim oFormularios As Object Dim oNuevoFormulario As Object oDoc = ThisComponent oHojaActiva = oDoc.getCurrentController.getActiveSheet() oPaginaDibujo = oHojaActiva.getDrawPage() oFormularios = oPaginaDibujo.getForms() 'Creamos un nuevo formulario oNuevoFormulario = oDoc.createInstance( "com.sun.star.form.component.Form" ) 'Lo agregamos a los formularios oFormularios.insertByName("MiDirectorio", oNuevoFormulario) End Sub
Puedes agregar formularios con el mismo nombre y no te dará ningún error, pero no es lo común, es mejor que verifiques que el nombre no exista como ya se vio y agregues nombres únicos a la colección de formularios para su fácil identificación.
Etiquetas (Label)
Las etiquetas son los controles más simples, pues su función es solo mostrar un texto al usuario sin que este pueda modificarlo, generalmente un titulo, un mensaje o el encabezado de un campo. Se les puede asociar un evento, por ejemplo, el clic del ratón, pero no es usual que se haga, generalmente son controles estáticos. El siguiente ejemplo, agrega una etiqueta al formulario llamado MiDirectorio.
Sub Etiquetas1() Dim oDoc As Object Dim oHojaActiva As Object Dim oPaginaDibujo As Object Dim oFormularios As Object Dim oFormulario As Object Dim oNuevaEtiqueta As Object Dim oNuevaEtiquetaModelo As Object oDoc = ThisComponent oHojaActiva = oDoc.getCurrentController.getActiveSheet() oPaginaDibujo = oHojaActiva.getDrawPage() oFormularios = oPaginaDibujo.getForms() oFormulario = oFormularios.getByName( "MiDirectorio" ) 'Creamos una nueva forma de control oNuevaEtiqueta = oDoc.createInstance("com.sun.star.drawing.ControlShape") 'Cambiamos su tamaño y posición Call CambiaTam( oNuevaEtiqueta, 5000, 1500 ) Call CambiaPos( oNuevaEtiqueta, 1000, 1000 ) 'Creamos una nueva etiqueta oNuevaEtiquetaModelo = oDoc.createInstance("com.sun.star.form.component.FixedText") 'Establecemos su nombres oNuevaEtiquetaModelo.Name = "lblId" 'El texto que verá el usuario oNuevaEtiquetaModelo.Label = "Clave" 'Conectamos la forma con el nuevo control oNuevaEtiqueta.Control = oNuevaEtiquetaModelo 'Lo agregamos al formulario, el primer argumento, en este caso 0, es el índice que tendrá el nuevo control agregado oFormulario.insertByIndex(0, oNuevaEtiquetaModelo) 'Agregamos la forma a la página de dibujo para que sea visible oPaginaDibujo.add( oNuevaEtiqueta ) End Sub 'Macro para cambiar la posición de un objeto Sub CambiaPos( Obj As Object, X As Long, Y As Long ) Dim oPos As New com.sun.star.awt.Point oPos.X = X oPos.Y = Y Obj.setPosition( oPos ) End Sub 'Macro para cambiar el tamaño de un objeto Sub CambiaTam( Obj As Object, Ancho As Long, Alto As Long ) Dim oTam As New com.sun.star.awt.Size oTam.Width = Ancho oTam.Height = Alto Obj.setSize( oTam ) End Sub
Las subrutinas para cambiar de posición y tamaño, son las mismas usadas en capítulos anteriores. Al ser una forma (shape), los controles soportan la mayoría de las propiedades vistas anteriormente (color, línea, relleno, fuente, etc), por lo que no las repetiremos aquí y nos centraremos en la forma de manipular las propiedades particulares de cada control desde su modelo, por ejemplo, para acceder a la etiqueta creada en el ejemplo anterior, usamos el siguiente código.
Sub Etiquetas2() Dim oDoc As Object Dim oHojaActiva As Object Dim oPaginaDibujo As Object Dim oFormularios As Object Dim oFormulario As Object Dim olblClave As Object oDoc = ThisComponent oHojaActiva = oDoc.getCurrentController.getActiveSheet() oPaginaDibujo = oHojaActiva.getDrawPage() oFormularios = oPaginaDibujo.getForms() oFormulario = oFormularios.getByName( "MiDirectorio" ) 'Referencia al control llamado lblId olblClave = oFormulario.getByName("lblId") 'Cambiamos el texto que ve el usuario olblClave.Label = "Nuevo texto" End Sub
Otras propiedades que puedes manipular en las etiquetas son.
Sub Etiquetas3() Dim oDoc As Object Dim oHojaActiva As Object Dim oPaginaDibujo As Object Dim oFormularios As Object Dim oFormulario As Object Dim olblClave As Object oDoc = ThisComponent oHojaActiva = oDoc.getCurrentController.getActiveSheet() oPaginaDibujo = oHojaActiva.getDrawPage() oFormularios = oPaginaDibujo.getForms() oFormulario = oFormularios.getByName( "MiDirectorio" ) 'Referencia al control llamado lblId olblClave = oFormulario.getByName("lblId") With olblClave .FontName = "Linux Biolinum" 'La fuente .FontHeight = 18 'El tamaño de fuente .BackgroundColor = RGB(200,200,200) 'El color de fondo .Border = 2 'El tipo de borde (2 = plano ) .BorderColor = RGB(255,0,0) 'El color del borde (solo efectivo si Border = 2) .TextColor = RGB(0,0,200) 'El color del texto .Align = 1 'Alineación horizontal .VerticalAlign = 1 'Alineación vertical End With End Sub
El borde (Border), también puede ser; sin borde (0) o 3D (1), la alienación horizontal puede ser a la izquierda (0), al centro (1) o a la derecha (2), la vertical, puede tomar los valores, arriba (0), en medio (1) o abajo (2). La mayoría de los controles, cuentan con una propiedad para activarlos o desactivarlos (Enabled), es decir, para permitir su interacción con el usuario o no, en el siguiente ejemplo, se invierta el valor de esta propiedad de la misma etiqueta.
Sub Etiquetas4() Dim oDoc As Object Dim oHojaActiva As Object Dim oPaginaDibujo As Object Dim oFormularios As Object Dim oFormulario As Object Dim olblClave As Object oDoc = ThisComponent oHojaActiva = oDoc.getCurrentController.getActiveSheet() oPaginaDibujo = oHojaActiva.getDrawPage() oFormularios = oPaginaDibujo.getForms() oFormulario = oFormularios.getByName( "MiDirectorio" ) 'Referencia al control llamado lblId olblClave = oFormulario.getByName("lblId") 'Invertimos el valor de la propiedad olblClave.Enabled = Not olblClave.Enabled End Sub
Esta propiedad es más útil en otro tipo de controles, que en las etiquetas.
Cuadros de texto (TextBox)
Los cuadro de texto (TextBox) son controles que nos permiten interactuar con el usuario, tanto para mostrar información, como para permitirle modificarla, en el siguiente ejemplo, agregamos un nuevo cuadro de texto a nuestro formulario.
Sub CuadroTexto1() Dim oDoc As Object Dim oHojaActiva As Object Dim oPaginaDibujo As Object Dim oFormularios As Object Dim oFormulario As Object Dim oCuadroTexto As Object Dim oCuadroTextoModelo As Object oDoc = ThisComponent oHojaActiva = oDoc.getCurrentController.getActiveSheet() oPaginaDibujo = oHojaActiva.getDrawPage() oFormularios = oPaginaDibujo.getForms() oFormulario = oFormularios.getByName( "MiDirectorio" ) 'Creamos una nueva forma de control oCuadroTexto = oDoc.createInstance("com.sun.star.drawing.ControlShape") 'Cambiamos su tamaño y posicion Call CambiaTam( oCuadroTexto, 10000, 800 ) Call CambiaPos( oCuadroTexto, 2000, 2000 ) 'Creamos un nuevo cuadro de texto oCuadroTextoModelo = oDoc.createInstance("com.sun.star.form.component.TextField") 'Establecemos su nombre oCuadroTextoModelo.Name = "txtNombre" 'Conectamos la forma con el nuevo control oCuadroTexto.Control = oCuadroTextoModelo 'Lo agregamos al formulario oFormulario.insertByIndex(0, oCuadroTextoModelo) 'Agregamos la forma a la página de dibujo para que sea visible oPaginaDibujo.add( oCuadroTexto ) End Sub
Los cuadros de texto, comparten algunas propiedades con las etiquetas.
Sub CuadroTexto2() Dim oDoc As Object Dim oHojaActiva As Object Dim oPaginaDibujo As Object Dim oFormularios As Object Dim oFormulario As Object Dim otxtNombre As Object oDoc = ThisComponent oHojaActiva = oDoc.getCurrentController.getActiveSheet() oPaginaDibujo = oHojaActiva.getDrawPage() oFormularios = oPaginaDibujo.getForms() oFormulario = oFormularios.getByName( "MiDirectorio" ) 'Referencia al control llamado txtNombre otxtNombre = oFormulario.getByName("txtNombre") With otxtNombre .FontName = "Linux Biolinum" 'La fuente .FontHeight = 14 'El tamaño de fuente .BackgroundColor = RGB(230,230,230) 'El color de fondo .Border = 1 'El tipo de borde (1 = 3D ) .TextColor = RGB(0,100,200) 'El color del texto .Align = 0 'Alineación horizontal (izquierda) End With End Sub
El principal uso de estos controles es recuperar su contenido o establecerlo.
Sub CuadroTexto3() Dim oDoc As Object Dim oHojaActiva As Object Dim oPaginaDibujo As Object Dim oFormularios As Object Dim oFormulario As Object Dim otxtNombre As Object Dim sInfo As String oDoc = ThisComponent oHojaActiva = oDoc.getCurrentController.getActiveSheet() oPaginaDibujo = oHojaActiva.getDrawPage() oFormularios = oPaginaDibujo.getForms() oFormulario = oFormularios.getByName( "MiDirectorio" ) 'Referencia al control llamado txtNombre otxtNombre = oFormulario.getByName("txtNombre") 'Recuperamos el texto del control sInfo = otxtNombre.Text 'Lo mostramos MsgBox sInfo 'Solicitamos un nuevo contenido sInfo = InputBox("Escribe un nuevo contenido para el control") 'Y lo establecemos otxtNombre.Text = sInfo End Sub
También puedes usar la propiedad String para recuperar o establecer el texto del control. Los cuadros de texto, cuentan con muchas más propiedades.
Sub CuadroTexto4() Dim oDoc As Object Dim oHojaActiva As Object Dim oPaginaDibujo As Object Dim oFormularios As Object Dim oFormulario As Object Dim otxtNombre As Object oDoc = ThisComponent oHojaActiva = oDoc.getCurrentController.getActiveSheet() oPaginaDibujo = oHojaActiva.getDrawPage() oFormularios = oPaginaDibujo.getForms() oFormulario = oFormularios.getByName( "MiDirectorio" ) 'Referencia al control llamado txtNombre otxtNombre = oFormulario.getByName("txtNombre") With otxtNombre .EchoChar = 42 'El carácter de contraseña 42 = * .MaxTextLen = 20 'Longitud máxima aceptada .MultiLine = True 'Si es o no multilínea .HScroll = False 'Si se muestra o no la barra de desplazamiento horizontal .VScroll = True 'Si se muestra o no la barra de desplazamiento vertical .Printable = True 'Si es imprime o no el control .ReadOnly = False 'Si es o no de solo lectura .DataField = "Nombre" 'Establece el campo de la base de datos mostrada End With End Sub
Algunas de estas propiedades se contraponen, por ejemplo, si estableces el control en multilínea (MultiLine), el carácter de contraseña (EchoChar) no tiene efecto como tampoco las barras de desplazamiento (Hscroll y Vscroll), por supuesto, si estableces el control en solo lectura (ReadOnly), el usuario no podrá escribir en él. El campo vinculado (DataField), solo será efectivo si previamente el formulario se relacionó con una base de datos y con una fuente de datos (tabla, consulta o instrucción SQL), además, el nombre del campo “debe existir” en el origen de datos. Si quieres quitar la relación, establece esta propiedad en vacía.
Puedes vincular el control con una celda de cualquier hoja, esto te permite reflejar cualquier cambio que se haga en uno en el otro, solo puedes establecer el campo vinculado (DataField) o la celda vinculada (ValueBinding), tendrá efecto el ultimo que establezcas como en nuestro ejemplo.
Sub CuadroTexto5() Dim oDoc As Object Dim oHojaActiva As Object Dim oPaginaDibujo As Object Dim oFormularios As Object Dim oFormulario As Object Dim otxtNombre As Object Dim oDirCeldaVinculada As Object Dim mOpc(0) As New "com.sun.star.beans.NamedValue" Dim oVinculo As Object oDoc = ThisComponent oHojaActiva = oDoc.getCurrentController.getActiveSheet() oPaginaDibujo = oHojaActiva.getDrawPage() oFormularios = oPaginaDibujo.getForms() oFormulario = oFormularios.getByName( "MiDirectorio" ) 'Referencia al control llamado txtNombre otxtNombre = oFormulario.getByName("txtNombre") 'Obtenemos la dirección de la celda B5 oDirCeldaVinculada = oHojaActiva.getCellByPosition(1,4).getCellAddress 'Creamos la propiedad para vincular mOpc(0).Name = "BoundCell" mOpc(0).Value = oDirCeldaVinculada 'Creamos la instancia de la celda a vincular oVinculo <nowiki>= </nowiki>oDoc.createInstanceWithArguments("com.sun.star.table.CellValueBinding", mOpc()) 'Y la vinculamos al cuadro de texto otxtNombre.setValueBinding( oVinculo ) End Sub
Puedes activar y desactivar (Enabled) el control, toma en cuenta que activarlo es diferente de establecerlo en solo lectura (ReadOnly).
Sub CuadroTexto6() Dim oDoc As Object Dim oHojaActiva As Object Dim oPaginaDibujo As Object Dim oFormularios As Object Dim oFormulario As Object Dim otxtNombre As Object oDoc = ThisComponent oHojaActiva = oDoc.getCurrentController.getActiveSheet() oPaginaDibujo = oHojaActiva.getDrawPage() oFormularios = oPaginaDibujo.getForms() oFormulario = oFormularios.getByName( "MiDirectorio" ) 'Referencia al control llamado txtNombre otxtNombre = oFormulario.getByName("txtNombre") 'Activamos y desactivamos el control otxtNombre.Enabled = Not otxtNombre.Enabled End Sub
Este control, es posible convertirlo en cuadro de texto enriquecido, capaz de mostrar texto con diferentes formatos.
Sub CuadroTexto7() Dim oDoc As Object Dim oHojaActiva As Object Dim oPaginaDibujo As Object Dim oFormularios As Object Dim oFormulario As Object Dim otxtNombre As Object Dim oCursor As Object oDoc = ThisComponent oHojaActiva = oDoc.getCurrentController.getActiveSheet() oPaginaDibujo = oHojaActiva.getDrawPage() oFormularios = oPaginaDibujo.getForms() oFormulario = oFormularios.getByName( "MiDirectorio" ) 'Referencia al control llamado txtNombre otxtNombre = oFormulario.getByName("txtNombre") 'Establecemos que sea multilínea y que soporte texto enriquecido otxtNombre.Multiline = True otxtNombre.RichText = True 'Creamos un cursor oCursor = otxtNombre.createTextCursor() 'Insertamos una línea de texto otxtNombre.insertString( oCursor, "Primera línea", False) 'Insertamos un salto de parrafo otxtNombre.insertControlCharacter( oCursor, 0, False) 'Insertamos otra línea de texto otxtNombre.insertString( oCursor, "Segunda línea", False) End Sub
Una tarea muy común al trabajar con controles, es enviarles el foco, es decir, mover el cursor a este, para ello, tenemos que aprender un nuevo concepto, hasta ahora para acceder a los controles de un formulario, nos ha bastado como medio el mismo formulario, a este modo de acceso se le llama modelo, pero para usar otras propiedades y métodos, solo es posible hacer a través de la vista del control; para entrar al modo vista, usamos el siguiente código.
Sub CuadroTexto8() Dim oDoc As Object Dim oHojaActiva As Object Dim oPaginaDibujo As Object Dim oFormularios As Object Dim oFormulario As Object Dim otxtNombre As Object Dim otxtNombreVista As Object oDoc = ThisComponent oHojaActiva = oDoc.getCurrentController.getActiveSheet() oPaginaDibujo = oHojaActiva.getDrawPage() oFormularios = oPaginaDibujo.getForms() oFormulario = oFormularios.getByName( "MiDirectorio" ) otxtNombre = oFormulario.getByName("txtNombre") 'Accedemos a la vista del control otxtNombreVista = oDoc.getCurrentController.getControl( otxtNombre ) 'Le enviamos el foco otxtNombreVista.setFocus() End Sub
Observa como accedemos al modo vista del control, a través del controlador (getCurrentController) del documento. Desde el modo vista, puedes acceder también al contenido del control con su propiedad Text, pero algunas otras propiedades solo están disponibles en este modo, como posibilidad de ocultar o mostrar el control.
Sub CuadroTexto9() Dim oDoc As Object Dim oHojaActiva As Object Dim oPaginaDibujo As Object Dim oFormularios As Object Dim oFormulario As Object Dim otxtNombre As Object Dim otxtNombreVista As Object oDoc = ThisComponent oHojaActiva = oDoc.getCurrentController.getActiveSheet() oPaginaDibujo = oHojaActiva.getDrawPage() oFormularios = oPaginaDibujo.getForms() oFormulario = oFormularios.getByName( "MiDirectorio" ) otxtNombre = oFormulario.getByName("txtNombre") 'Accedemos a la vista del control otxtNombreVista = oDoc.getCurrentController.getControl( otxtNombre ) 'Alternamos entre mostrar y ocultar el control otxtNombreVista.setVisible( Not otxtNombreVista.isVisible ) End Sub
Toma en cuenta que si el formulario esta en modo diseño, el control de todos modos se mostrará, este método, solo tiene efecto en tiempo de ejecución. Casi todos los controles que veremos, tienen su modo vista y la posibilidad de enviar el foco y ocultarlos.
Casilla de verificación (CheckBox)
Las casillas de verificación (CheckBox), son controles de verdadero o falso, es decir, generalmente se usan para indicar si se hace o no una actividad u opción. El siguiente ejemplo agrega una casilla de verificación a nuestro formulario.
Sub CasillaVerificacion1() Dim oDoc As Object Dim oHojaActiva As Object Dim oPaginaDibujo As Object Dim oFormularios As Object Dim oFormulario As Object Dim oCasilla As Object Dim oCasillaModelo As Object oDoc = ThisComponent oHojaActiva = oDoc.getCurrentController.getActiveSheet() oPaginaDibujo = oHojaActiva.getDrawPage() oFormularios = oPaginaDibujo.getForms() oFormulario = oFormularios.getByName( "MiDirectorio" ) 'Creamos una nueva forma de control oCasilla = oDoc.createInstance("com.sun.star.drawing.ControlShape") 'Cambiamos su tamaño y posicion Call CambiaTam( oCasilla, 8000, 800 ) Call CambiaPos( oCasilla, 3000, 5000 ) 'Creamos una nueva casilla de verificación oCasillaModelo = oDoc.createInstance("com.sun.star.form.component.CheckBox") 'Establecemos su nombre oCasillaModelo.Name = "chkMayus" 'Y el texto que verá el usuario oCasillaModelo.Label = "Guardar todo en MAYUSCULAS" 'Conectamos la forma con el nuevo control oCasilla.Control = oCasillaModelo 'Lo agregamos al formulario oFormulario.insertByIndex(0, oCasillaModelo) 'Agregamos la forma a la página de dibujo para que sea visible oPaginaDibujo.add( oCasilla ) End Sub
Al contar con texto para mostrar al usuario, este se puede formatear completamente como en las etiquetas (label) y los cuadros de texto (textbox).
Sub CasillaVerificacion2() Dim oFormulario As Object Dim ochkMayus As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) ochkMayus = oFormulario.getByName( "chkMayus" ) With ochkMayus .Align = 0 'Alineación horizontal .BackgroundColor = RGB(200,220,240) 'Color de fondo .TextColor = RGB(50,70,90) 'Color de la fuente .FontHeight = 16 'Tamaño de la fuente .Printable = True 'Si se imprime el control .VerticalAlign = 1 'Alineación vertical .TriState = False 'Establece el estado triple .VisualEffect = 2 'Formato plano (1 = 3D) End With End Sub
Puedes activarlo y desactivarlo.
Sub CasillaVerificacion3() Dim oFormulario As Object Dim ochkMayus As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) ochkMayus = oFormulario.getByName( "chkMayus" ) 'Alternamos la activación del control ochkMayus.Enabled = Not ochkMayus.Enabled End Sub
Para obtener o establecer el estado del control, se usa la propiedad State, esta puede tomar los valores 0, 1 o 2, dependiendo si; esta activa o no, y de la propiedad de triple estado (TriState), que permite tener este control en activado, desactivado o sin selección.
Sub CasillaVerificacion4() Dim oFormulario As Object Dim ochkMayus As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) ochkMayus = oFormulario.getByName( "chkMayus" ) 'Verificamos el estado de la casilla Select Case ochkMayus.State Case 0 MsgBox "La casilla no esta seleccionada" Case 1 MsgBox "La casilla esta seleccionada" Case 2 MsgBox "La casilla no tiene selección" End Select 'La activamos ochkMayus.State = 1 End Sub
Las casillas de verificación, también las puedes vincular con un campo de datos (DataField) o con una celda (ValueBinding), con el mismo código de los cuadros de texto.
Campo formateado (FormattedField)
Los campos formateados (FormattedField), son controles casi idénticos a los cuadros de texto (TextBox), con la diferencia de que estos aceptan todos los formatos que tenemos disponibles en el menú Formato > Celdas... > Números, y se les puede establecer un valor máximo y un mínimo.
Sub CampoFormateado1() Dim oFormulario As Object Dim oCuadroConFormato As Object Dim oCuadroConFormatoModelo As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) 'Creamos una nueva forma de control oCuadroConFormato = ThisComponent.createInstance("com.sun.star.drawing.ControlShape") 'Cambiamos su tamaño y posicion Call CambiaTam( oCuadroConFormato, 8000, 800 ) Call CambiaPos( oCuadroConFormato, 3000, 5000 ) 'Creamos un nuevo campo formateado oCuadroConFormatoModelo = ThisComponent.createInstance( "com.sun.star.form.component.FormattedField" ) 'Establecemos su nombre oCuadroConFormatoModelo.Name = "txtFVentas" 'Conectamos la forma con el nuevo control oCuadroConFormato.Control = oCuadroConFormatoModelo 'Lo agregamos al formulario oFormulario.insertByIndex(0, oCuadroConFormatoModelo) 'Agregamos la forma a la página de dibujo para que sea visible ThisComponent.getCurrentController.getActiveSheet.getDrawPage.add( oCuadroConFormato ) End Sub
Puede usar las mismas propiedades que para los cuadros de texto (TextBox), aquí vemos las propiedades particulares para este control.
Sub CampoFormateado2() Dim oFormulario As Object Dim otxtfVentas As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) otxtfVentas = oFormulario.getByName ( "txtFVentas" ) With otxtfVentas .EffectiveMin = 1 'El valor mínimo .EffectiveMax = 100 'El valor máximo .Spin = True 'Si se muestra o no el campo giratorio .FormatKey = 4 'El formato para el contenido ( 4 = "#,##0.00" ) End With End Sub
Si estableces que se muestre el campo giratorio (Spin), la alienación del contenido siempre será a la izquierda. El valor para el formato (FormatKey), es el mismo para las celdas, puedes obtener estos valores con la macro que te muestro en Listar formatos en un archivo de Calc. Este control también lo puedes activar y desactivar (Enabled) y establecerle un campo de datos origen (DataField), así como vincularlo con una celda (ValueBinding).
Botón de comando (CommandButton)
Los botones de comando (CommandButton) son controles generalmente usados para iniciar una acción por que usualmente tienen asociada una macro al evento Clic del ratón, aunque soportan varios más. Veamos como agregar uno a nuestro formulario.
Sub BotonComando1() Dim oFormulario As Object Dim oBotonComando As Object Dim oBotonComandoModelo As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) 'Creamos una nueva forma de control oBotonComando = ThisComponent.createInstance("com.sun.star.drawing.ControlShape") 'Cambiamos su tamaño y posicion Call CambiaTam( oBotonComando, 5000, 800 ) Call CambiaPos( oBotonComando, 3000, 10000 ) 'Creamos un nuevo botón de comando oBotonComandoModelo = ThisComponent.createInstance("com.sun.star.form.component.CommandButton") 'Establecemos su nombre oBotonComandoModelo.Name = "cmdGuardar" oBotonComandoModelo.Label = "~Guardar" 'Conectamos la forma con el nuevo control oBotonComando.Control = oBotonComandoModelo 'Lo agregamos al formulario oFormulario.insertByIndex(0, oBotonComandoModelo) 'Agregamos la forma a la página de dibujo para que sea visible ThisComponent.getCurrentController.getActiveSheet.getDrawPage.add( oBotonComando ) End Sub
Observa el símbolo ~ antes del título del botón de comando, este, nos permite subrayar la letra inmediata siguiente para usarse como método abreviado de teclado, ten cuidado, si estableces una combinación ya usada en la interfaz del usuario, esta tendrá preferencia, en los formularios, este método abreviado tiene una función ligeramente diferente, cuando el foco, es decir el cursor, esta dentro de algún control del formulario, la combinación de teclas llevará el cursor a dicho control, pero solo eso, solo le lleva el foco. Veamos las principales propiedades particulares de este control.
Sub BotonComando2() Dim oFormulario As Object Dim ocmdGuardar As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) 'Creamos una nueva forma de control ocmdGuardar = oFormulario.getByName ("cmdGuardar") With ocmdGuardar .Align = 1 'Alineación horizontal ( 1 = centro ) .VerticalAlign = 1 'Alineación vertical ( 1 = medio ) .BackgroundColor = RGB(220,230,240) 'Color de fondo .DefaultButton = True 'Si es el botón predeterminado .FontName = "Linux Biolinum" 'La fuente .FontHeight = 18 'El tamaño de fuente .TextColor = RGB(0,20,250) 'El color del texto .Printable = True 'Si se imprime el control End With End Sub
Este control también cuenta con la propiedad para activar o desactivar (Enabled), muy útil para deshabilitar momentáneamente su uso, cuando tiene una macro asociada.
Botón de opción (OptionButton)
Estos controles generalmente trabajan juntos dos o más, pues permiten seleccionar solo una opción de entre los que haya en el formulario, por ello, generalmente se agregan dos o más como en el siguiente ejemplo.
Sub BotonOpcion1() Dim oFormulario As Object Dim oBotonOpcion As Object Dim oBotonOpcionModelo As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) 'Creamos una nueva forma de control oBotonOpcion = ThisComponent.createInstance("com.sun.star.drawing.ControlShape") 'Cambiamos su tamaño y posicion Call CambiaTam( oBotonOpcion, 5000, 800 ) Call CambiaPos( oBotonOpcion, 3000, 11000 ) 'Creamos un nuevo botón de opción oBotonOpcionModelo = ThisComponent.createInstance("com.sun.star.form.component.RadioButton") 'Establecemos su nombre oBotonOpcionModelo.Name = "optEstilo" oBotonOpcionModelo.Label = "Color" 'Conectamos la forma con el nuevo control oBotonOpcion.Control = oBotonOpcionModelo 'Lo agregamos al formulario oFormulario.insertByIndex(0, oBotonOpcionModelo) 'Agregamos la forma a la página de dibujo para que sea visible ThisComponent.getCurrentController.getActiveSheet.getDrawPage.add( oBotonOpcion ) 'Agregamos un segundo control oBotonOpcion = ThisComponent.createInstance("com.sun.star.drawing.ControlShape") Call CambiaTam( oBotonOpcion, 5000, 800 ) Call CambiaPos( oBotonOpcion, 3000, 12000 ) oBotonOpcionModelo = ThisComponent.createInstance("com.sun.star.form.component.RadioButton") oBotonOpcionModelo.Name = "optEstilo" oBotonOpcionModelo.Label = "Escala de grises" oBotonOpcion.Control = oBotonOpcionModelo oFormulario.insertByIndex(0, oBotonOpcionModelo) ThisComponent.getCurrentController.getActiveSheet.getDrawPage.add( oBotonOpcion ) 'Y un tercero oBotonOpcion = ThisComponent.createInstance("com.sun.star.drawing.ControlShape") Call CambiaTam( oBotonOpcion, 5000, 800 ) Call CambiaPos( oBotonOpcion, 3000, 13000 ) oBotonOpcionModelo = ThisComponent.createInstance("com.sun.star.form.component.RadioButton") oBotonOpcionModelo.Name = "optEstilo" oBotonOpcionModelo.Label = "Blanco y negro" oBotonOpcion.Control = oBotonOpcionModelo oFormulario.insertByIndex(0, oBotonOpcionModelo) ThisComponent.getCurrentController.getActiveSheet.getDrawPage.add( oBotonOpcion ) End Sub
Observa que a los tres les hemos establecido el mismo nombre, esto es importante, si quieres que se comporten como un grupo, de este modo, puedes crear tantos grupos de controles de botón de opción (OptionButton) como quieras, simplemente estableciendo el mismo nombre para cada grupo agregado. Al tener texto visible por el usuario, comparten la mayoría de las propiedades vistas hasta ahora (color de fuente y fondo, tamaño de fuente, estilo de fuente, etc), pero observa que hasta ahora, hemos usado el nombre del control para hacer referencia a el, pero a estos controles les hemos dado el mismo nombre, para distinguirlos, ahora accederemos a ellos con su índice, en vez de con su nombre, como en el siguiente ejemplo.
Sub BotonOpcion2() Dim oFormulario As Object Dim ooptEstilo As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) ooptEstilo = oFormulario.getByIndex(0) ooptEstilo.BackgroundColor = RGB(Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255) 'Color de fondo ooptEstilo.TextColor = RGB(Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255) 'Color de la fuente ooptEstilo = oFormulario.getByIndex(1) ooptEstilo.BackgroundColor = RGB(Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255) 'Color de fondo ooptEstilo.TextColor = RGB(Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255) 'Color de la fuente ooptEstilo = oFormulario.getByIndex(2) ooptEstilo.BackgroundColor = RGB(Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255) 'Color de fondo ooptEstilo.TextColor = RGB(Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255) 'Color de la fuente End Sub
Y con justa razón te preguntarás, ¿como se que índice tiene cada control? Puedes hacerlo de varias maneras, visualmente en la interfaz de Calc, en el navegador de formularios, para ver esta ventana, tienes que tener visible la barra de herramientas Campos de control de formulario, visible desde el menú Ver > Barra de herramientas ->, después solo sigue la secuencia de la imagen siguiente.
Con código, puedes acceder a los controles por el nombre del grupo, como en el ejemplo siguiente.
Sub BotonOpcion3() Dim oFormulario As Object Dim oGrupoEstilo() As Object Dim oBoton As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) 'Accedemos al grupo completo oFormulario.getGroupByName("optEstilo", oGrupoEstilo) 'Iteramos entre los elementos del grupo For Each oBoton In oGrupoEstilo() 'Cambiamos el color de fondo aleatoriamente oBoton.BackgroundColor = RGB(Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255) Next End Sub
Lo importante de los botones de opción (Optionbutton) es saber cual de ellos, dentro del grupo, esta seleccionado, para ello se consulta su propiedad State, que solo uno de ellos puede tener en verdadero (True).
Sub BotonOpcion4() Dim oFormulario As Object Dim oGrupoEstilo() As Object Dim oBoton As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oFormulario.getGroupByName("optEstilo", oGrupoEstilo) For Each oBoton In oGrupoEstilo() 'Consultamos el estado del botón If oBoton.State Then 'Mostramos el que este seleccionado MsgBox "Opción seleccionada: " & oBoton.Label Exit For End If Next End Sub
Como veremos más adelante, cuando se asocia una macro al evento clic de los botones de opción, es muy sencillo saber cual es el que esta seleccionado, sin recorrer uno a uno. Estos controles también cuenta con la propiedad de activarse o desactivarse (Enabled) y la capacidad para establecerle un campo de datos origen (DataField), así como vincularlo con una celda (ValueBinding).
Cuadro de lista (ListBox)
Los cuadros de lista (ListBox), son controles usados generalmente para mostrar un listado y poder seleccionar una o varias opciones dependiendo de sus propiedades, en el siguiente ejemplo, agregamos un nuevo control de lista a nuestro formulario.
Sub CuadroLista1() Dim oFormulario As Object Dim oCuadroLista As Object Dim oCuadroListaModelo As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) 'Creamos una nueva forma de control oCuadroLista = ThisComponent.createInstance("com.sun.star.drawing.ControlShape") 'Cambiamos su tamaño y posicion Call CambiaTam( oCuadroLista, 5000, 5000 ) Call CambiaPos( oCuadroLista, 3000, 10000 ) 'Creamos un nuevo cuadro de lista oCuadroListaModelo = ThisComponent.createInstance("com.sun.star.form.component.ListBox") 'Establecemos su nombre oCuadroListaModelo.Name = "lstCiudades" 'Conectamos la forma con el nuevo control oCuadroLista.Control = oCuadroListaModelo 'Lo agregamos al formulario oFormulario.insertByIndex(0, oCuadroListaModelo) 'Agregamos la forma a la página de dibujo para que sea visible ThisComponent.getCurrentController.getActiveSheet.getDrawPage.add( oCuadroLista ) End Sub
Las propiedades principales de este control son.
Sub CuadroLista2() Dim oFormulario As Object Dim olstCiudades As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) olstCiudades = oFormulario.getByName( "lstCiudades" ) With olstCiudades .BackgroundColor = RGB(Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255) 'Color de fondo .Border = 2 'Tipo de borde ( 1 = 3D ) .BorderColor = RGB(Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255) 'Solo si Border = 2 .Dropdown = False 'Si es desplegable .MultiSelection = True 'Si se permite la multiselección End With End Sub
Si estableces que el control sea desplegable (Dropdown), te mostrará una flecha para desplegar el contenido, con lo que se comportará de forma similar al cuadro combinado (ComboBox), mi recomendación es establecer esta propiedad siempre en falso (False), si quieres un cuadro combinado, usa el control visto en el siguiente tema.
Hay varias formas de agregar elementos a un cuadro de lista, la primera y más sencilla es agregar una matriz de datos.
Sub CuadroLista3() Dim oFormulario As Object Dim olstCiudades As Object Dim mDatos() oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) olstCiudades = oFormulario.getByName( "lstCiudades" ) mDatos = Array("Mexico", "Madrid","Buenos Aires","Bogota","Lima") olstCiudades.StringItemList = mDatos() End Sub
Este control acepta también como origen de datos un campo de bases de datos (DataField). Otra forma es vincular el control con un origen de celdas, tanto para el valor seleccionado (ValueBinding), como para los valores mostrados (ListEntrySource).
Sub CuadroLista4() Dim oFormulario As Object Dim olstCiudades As Object Dim oDirCeldaVinculada As Object Dim oRangoOrigen As Object Dim mOpc(0) As New "com.sun.star.beans.NamedValue" Dim oVinculo As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) olstCiudades = oFormulario.getByName( "lstCiudades" ) 'Obtenemos la dirección de la celda B5 oDirCeldaVinculada = ThisComponent.getCurrentController.getActiveSheet.getCellByPosition(3,24).getCellAddress 'Creamos la propiedad para vincular mOpc(0).Name = "BoundCell" mOpc(0).Value = oDirCeldaVinculada 'Creamos la instancia de la celda a vincular createInstanceWithArguments oVinculo <nowiki>= </nowiki>ThisComponent.createInstanceWithArguments("com.sun.star.table.CellValueBinding", mOpc()) 'Y la vinculamos al cuadro de lista olstCiudades.setValueBinding( oVinculo ) 'Establecemos el rango de celdas origen oRangoOrigen = ThisComponent.getCurrentController.getActiveSheet.getCellRangeByName("D27:D40").getRangeAddress mOpc(0).Name = "CellRange" mOpc(0).Value = oRangoOrigen 'Creamos el vinculo oVinculo <nowiki>= </nowiki>ThisComponent.createInstanceWithArguments( "com.sun.star.table.CellRangeListSource", mOpc()) 'Lo vinculamos al cuadro de lista olstCiudades.setListEntrySource( oVinculo ) End Sub
Otra forma es agregar (y quitar) los elementos de forma dinámica, para lograr esto, repasemos un concepto para el acceso a propiedades y métodos de los controles, hasta ahora, con hacer referencia al control a través del formulario nos era suficiente, a esta forma de referencia se le llama de acceso al modelo, pero algunas propiedades y métodos solo están disponibles en el modo de acceso vista, para acceder a este modo, usamos el siguiente código.
Sub CuadroLista5() Dim oFormulario As Object Dim olstCiudades As Object Dim olstCiudadesVista As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) olstCiudades = oFormulario.getByName( "lstCiudades" ) 'Accedemos a la vista del control a través del controlador del documento olstCiudadesVista = ThisComponent.getCurrentController.getControl( olstCiudades ) 'Y podemos enviar el foco, es decir, el cursor a el olstCiudadesVista.setFocus() End Sub
En el acceso vista, tenemos una serie de métodos y propiedades para manipular completamente los elementos de un cuadro de lista (ListBox), veamos los más importantes. Para agregar elementos usamos el método addItem de la siguiente manera.
Sub CuadroLista6() Dim oFormulario As Object Dim olstCiudades As Object Dim olstCiudadesVista As Object Dim sInfo As String oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) olstCiudades = oFormulario.getByName( "lstCiudades" ) olstCiudadesVista = ThisComponent.getCurrentController.getControl( olstCiudades ) Do 'Solicitamos un elemento sInfo = Trim( InputBox("Escribe la ciudad a agregar")) 'Si esta vacio salimos If sInfo = "" Then Exit Do 'Lo agregamos como primer elemento olstCiudadesVista.addItem( sInfo, 0) Loop End Sub
El código anterior siempre agregará los nuevos elementos al inicio de la lista, si quieres agregarlos al final, tenemos que saber cuantos elementos ya existen en la lista, esto lo logramos con la propiedad ItemCount, que te devuelve el número total de elementos actuales en el cuadro de lista.
Sub CuadroLista7() Dim oFormulario As Object Dim olstCiudades As Object Dim olstCiudadesVista As Object Dim sInfo As String oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) olstCiudades = oFormulario.getByName( "lstCiudades" ) olstCiudadesVista = ThisComponent.getCurrentController.getControl( olstCiudades ) Do sInfo = Trim( InputBox("Escribe la ciudad a agregar")) If sInfo = "" Then Exit Do 'Lo agregamos como ultimo elemento olstCiudadesVista.addItem( sInfo, olstCiudadesVista.ItemCount) Loop End Sub
También podemos agregar una matriz completa.
Sub CuadroLista8() Dim oFormulario As Object Dim olstCiudades As Object Dim olstCiudadesVista As Object Dim sInfo() oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) olstCiudades = oFormulario.getByName( "lstCiudades" ) olstCiudadesVista = ThisComponent.getCurrentController.getControl( olstCiudades ) sInfo = Array("Barcelona","Montevideo","Arequipa") 'Agregamos una matriz completa olstCiudadesVista.addItems( sInfo, 0) End Sub
Observa que el método es addItems, en plural. Solo puedes agregar matrices de una sola dimensión. Como recomendación, cuando los datos a agregar sean muchos, lo notaras si tu código se ejecuta lento, primero llena la matriz y después usa addItems, veras la diferencia en comparación a agregar cada elemento individual con addItem.
Ahora, vamos a eliminar elementos de la lista, para ellos existe un solo método, pero es más que suficiente.
Sub CuadroLista9() Dim oFormulario As Object Dim olstCiudades As Object Dim olstCiudadesVista As Object Dim iRes As Integer oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) olstCiudades = oFormulario.getByName( "lstCiudades" ) olstCiudadesVista = ThisComponent.getCurrentController.getControl( olstCiudades ) iRes = MsgBox( "¿Estas seguro de borrar el siguiente elemento? = " & olstCiudadesVista.getItem( 0 ), 4) If iRes = 6 Then 'Quitamos el primer elemento de la lista olstCiudadesVista.removeItems( 0,1 ) End If iRes = MsgBox( "¿Estas seguro de borrar el siguiente elemento? = " & olstCiudadesVista.getItem( olstCiudadesVista.getItemCount-1 ), 4) If iRes = 6 Then 'Quitamos el ultimo elemento de la lista olstCiudadesVista.removeItems( olstCiudadesVista.getItemCount-1,1 ) End If End Sub
El método para eliminar elementos (removeItems), requiere de dos argumentos, el primero es la posición del primer elemento a borrar, las posiciones del cuadro de lista, como en las matrices, siempre empieza en cero, el segundo argumento es el número total de elementos a borrar. En los dos ejemplos anteriores, solo eliminamos un elemento, el primero (0) y el ultimo (getItemCount-1), es decir, contamos el total de elemento y le restamos uno para obtener el índice del ultimo elemento. Observa como le mostramos al usuario el elemento a borrar con el método getItem, simplemente pasándole el índice del elemento a mostrar, este método siempre te devuelve un texto (string) con el contenido del elemento indicado. Con estos argumentos en posible limpiar la lista completa, es decir, dejarla en blanco para empezar de nuevo.
Sub CuadroLista10() Dim oFormulario As Object Dim olstCiudades As Object Dim olstCiudadesVista As Object Dim iRes As Integer oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) olstCiudades = oFormulario.getByName( "lstCiudades" ) olstCiudadesVista = ThisComponent.getCurrentController.getControl( olstCiudades ) iRes = MsgBox( "¿Estas seguro de borrar TODOS los elementos de la lista?", 4 ) If iRes = 6 Then 'Quitamos todos los elementos de la lista olstCiudadesVista.removeItems( 0, olstCiudadesVista.getItemCount ) End If End Sub
Recuerda que es una buena practica de programación, cuando se realizan operaciones que no se puedan deshacer, sobre todo si son de borrado, preguntar al usuario si esta seguro de realizarla. Ya vimos como devolver un elemento de la lista (getItem), ahora, veremos como devolver todos los elementos de la lista (getItems).
Sub CuadroLista11() Dim oFormulario As Object Dim olstCiudades As Object Dim olstCiudadesVista As Object Dim mDatos() Dim co1 As Integer oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) olstCiudades = oFormulario.getByName( "lstCiudades" ) olstCiudadesVista = ThisComponent.getCurrentController.getControl( olstCiudades ) 'Devolvemos todos los elementos a una matriz mDatos() = olstCiudadesVista.getItems() 'Mostramos los elementos en la matriz For co1 = LBound(mDatos) To Ubound(mDatos) MsgBox mDatos(co1) Next co1 End Sub
Un punto importante es saber que elemento o elementos selecciono el usuario, para ello tenemos varios métodos, veamos.
Sub CuadroLista12() Dim oFormulario As Object Dim olstCiudades As Object Dim olstCiudadesVista As Object Dim sSeleccionado As String Dim iPos As Integer oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) olstCiudades = oFormulario.getByName( "lstCiudades" ) olstCiudadesVista = ThisComponent.getCurrentController.getControl( olstCiudades ) 'Obtenemos el elemento seleccionado sSeleccionado = olstCiudadesVista.getSelectedItem() 'Obtenemos la posición del elemento seleccionado iPos = olstCiudadesVista.getSelectedItemPos() 'Mostramos la información MsgBox "Esta seleccionado: " & sSeleccionado & " en la posición " & iPos End Sub
Estos métodos siempre te devolverán un solo elemento, si el cuadro de lista (ListBox) no tiene ningún elemento seleccionado, el método getSelectedItemPos, te devolverá un valor negativo de -1, si el cuadro de lista (ListBox) tiene activada la propiedad para selecciones múltiples (MultiSelection), tienes que usar otros métodos.
Sub CuadroLista13() Dim oFormulario As Object Dim olstCiudades As Object Dim olstCiudadesVista As Object Dim mSeleccionados() As String Dim mPos() As Integer Dim co1 As Integer oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) olstCiudades = oFormulario.getByName( "lstCiudades" ) olstCiudadesVista = ThisComponent.getCurrentController.getControl( olstCiudades ) 'Obtenemos los elementos seleccionados mSeleccionados() = olstCiudadesVista.getSelectedItems() 'Obtenemos la posición del los elementos seleccionados mPos() = olstCiudadesVista.getSelectedItemsPos() For co1 = LBound(mPos) To UBound(mPos) 'Mostramos la información MsgBox "Esta seleccionado: " & mSeleccionados(co1) & " en la posición " & mPos(co1) Next co1 End Sub
Observa que en los dos casos estamos obteniendo matrices de datos. Para finalizar de ver las propiedades y métodos más importantes de los cuadros de lista (ListBox), también es posible seleccionar elementos por código, veamos como.
Sub CuadroLista14() Dim oFormulario As Object Dim olstCiudades As Object Dim olstCiudadesVista As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) olstCiudades = oFormulario.getByName( "lstCiudades" ) olstCiudadesVista = ThisComponent.getCurrentController.getControl( olstCiudades ) 'Seleccionamos el primer elemento de la lista olstCiudadesVista.selectItemPos(0, True) 'Seleccionamos el ultimo elemento de la lista olstCiudadesVista.selectItemPos(olstCiudadesVista.getItemCount-1, True) End Sub
En el ejemplo, seleccionamos el primero y el ultimo elemento, dependiendo de la propiedad de multiselección (MultiSelection), el resultado será diferente, si esta en falso (False), la selección reemplazará a la anterior, si esta en verdadero (True), la selección se sumará a lo ya seleccionado. También puedes seleccionar varios elementos al mismo tiempo, claro, si la multiselección (MultiSelection) esta en verdadero (True).
Sub CuadroLista15() Dim oFormulario As Object Dim olstCiudades As Object Dim olstCiudadesVista As Object Dim mSeleccionar() oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) olstCiudades = oFormulario.getByName( "lstCiudades" ) olstCiudadesVista = ThisComponent.getCurrentController.getControl( olstCiudades ) mSeleccionar() = Array(1,3,5) 'Seleccionamos los elementos de la matriz olstCiudadesVista.selectItemsPos(mSeleccionar(), True) End Sub
Por ultimo, puedes seleccionar un elemento por su contenido en vez de por su posición como en el siguiente ejemplo.
Sub CuadroLista16() Dim oFormulario As Object Dim olstCiudades As Object Dim olstCiudadesVista As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) olstCiudades = oFormulario.getByName( "lstCiudades" ) olstCiudadesVista = ThisComponent.getCurrentController.getControl( olstCiudades ) 'Seleccionamos el elemento "Lima" olstCiudadesVista.selectItem("Lima", True) End Sub
Si el elemento no existe, no selecciona nada, por supuesto, con los métodos aprendidos en este tema, puedes asegurarte de que si exista, ¿verdad?. Este control también acepta la activación o desactivado por código (Enabled).
Cuadro combinado (ComboBox)
Los cuadro combinados (ComboBox), son una combinación de un cuadro de lista (ListBox) y un cuadro de texto (TextBox), cuentan con una flecha en el extremo derecho para desplegar el contenido de la lista, pues esta, permanece oculta y solo es visible el elemento actualmente seleccionado, para agregar este control a nuestro formulario, usamos.
Sub CuadroCombinado1() Dim oFormulario As Object Dim oCuadroCombinado As Object Dim oCuadroCombinadoModelo As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) 'Creamos una nueva forma de control oCuadroCombinado = ThisComponent.createInstance("com.sun.star.drawing.ControlShape") 'Cambiamos su tamaño y posicion Call CambiaTam( oCuadroCombinado, 5000, 700 ) Call CambiaPos( oCuadroCombinado, 3000, 10000 ) 'Creamos un nuevo cuadro combinado oCuadroCombinadoModelo = ThisComponent.createInstance("com.sun.star.form.component.ComboBox") 'Establecemos su nombre oCuadroCombinadoModelo.Name = "cboPaises" oCuadroCombinadoModelo.DropDown = True 'Conectamos la forma con el nuevo control oCuadroCombinado.Control = oCuadroCombinadoModelo 'Lo agregamos al formulario oFormulario.insertByIndex(0, oCuadroCombinadoModelo) 'Agregamos la forma a la página de dibujo para que sea visible ThisComponent.getCurrentController.getActiveSheet.getDrawPage.add( oCuadroCombinado ) End Sub
Al ser una combinación de los controles mencionados (ListBox y TextBox), comparten con estos la mayoría de sus propiedades y métodos, sobre todo con el cuadro de lista (ListBox). Como propiedades particulares de este, tenemos el número de líneas que muestra cuando se despliega el control.
Sub CuadroCombinado2() Dim oFormulario As Object Dim ocboPaises As Object Dim mDatos() oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) ocboPaises = oFormulario.getByName("cboPaises") 'Agregamos datos al cuadro combinado mDatos() = Array("México","Belice","El Salvador","Nicaragua") With ocboPaises .StringItemList = mDatos() .LineCount = 5 'El número de líneas a mostrar cuando se despliegue .MaxTextLen = 20 'El máximo de caracteres a aceptar End With End Sub
Para agrega y eliminar elementos de este control, se usan exactamente los mismo métodos que en el cuadro de lista (ListBox), sin olvidar que hay que hacerlo desde el modo vista del control, excepto los relacionados con la selección de elementos (selectItem, selectItemPos, selectItemsPos), puesto que este control trabaja de forma un poco diferente, cuando se selecciona un elemento de la lista (no es posible hacer multiselecciones), este valor se establece como valor de su propiedad Text, que puedes cambiar, esto es, el control puede tener un valor diferente a los de la lista de elementos.
Sub CuadroCombinado3() Dim oFormulario As Object Dim ocboPaises As Object Dim sDato As String oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) ocboPaises = oFormulario.getByName("cboPaises") 'Mostramos el elemento seleccionado MsgBox ocboPaises.Text 'Cambiamos el texto ocboPaises.Text = InputBox("Escribe un nuevo valor para el control") End Sub
La posibilidad de agregar elementos diferentes a los de la lista, puede tener dos vertientes, la primera (negativa) puede ser que se capture un dato no deseado, la segunda (positiva) es que el usuario puede agregar elementos nuevos directamente. Con los métodos vistos, tu determinaras si permites esto o no, dependiendo de tus necesidades, la perspectiva de una u otra, puede cambiar. Puedes usar la activación o desactivación para este control (Enabled)
Botón de selección (SpinButton)
Este control nos permite aumentar o disminuir el valor de otro control (o celda), por ello generalmente trabaja en conjunto con otro, para agregar uno al formulario, usamos.
Sub BotonSeleccion1() Dim oFormulario As Object Dim oBotonSeleccion As Object Dim oBotonSeleccionModelo As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) 'Creamos una nueva forma de control oBotonSeleccion = ThisComponent.createInstance("com.sun.star.drawing.ControlShape") 'Cambiamos su tamaño y posicion Call CambiaTam( oBotonSeleccion, 4000, 700 ) Call CambiaPos( oBotonSeleccion, 3000, 15000 ) 'Creamos un nuevo botón de selección oBotonSeleccionModelo = ThisComponent.createInstance("com.sun.star.form.component.SpinButton") 'Establecemos su nombre oBotonSeleccionModelo.Name = "spnEdad" 'Conectamos la forma con el nuevo control oBotonSeleccion.Control = oBotonSeleccionModelo 'Lo agregamos al formulario oFormulario.insertByIndex(0, oBotonSeleccionModelo) 'Agregamos la forma a la página de dibujo para que sea visible ThisComponent.getCurrentController.getActiveSheet.getDrawPage.add( oBotonSeleccion ) End Sub
Las principales propiedades de este control son.
Sub BotonSeleccion2() Dim oFormulario As Object Dim ospnEdad As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) ospnEdad = oFormulario.getByName("spnEdad") With ospnEdad .BackGroundColor = RGB(Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255) 'Color de fondo .Border = 2 'Tipo de borde ( 2 = Plano, 1 = 3D ) .BorderColor = RGB(Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255) 'Color del borde, solo si Border = 2 .Orientation = 1 'Orientación 1 = vertical, 0 = horizontal .Printable = True 'Si se imprime el control .SymbolColor = RGB(Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255) 'Color del símbolo (las flechas) .SpinValueMin = 0 'Valor mínimo .SpinValueMax = 20 'Valor máximo .SpinIncrement = 2 'Incremento End With End Sub
De forma predeterminada, el control se agrega en forma horizontal, si cambias su orientación (Orientation) a vertical, tienes que cambiar su tamaño, de forma que quede más alto que ancho, si no, veras un control totalmente desajustado. Para obtener el valor actual del control, usamos el siguiente código.
Sub BotonSeleccion3() Dim oFormulario As Object Dim ospnEdad As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) ospnEdad = oFormulario.getByName("spnEdad") MsgBox "Valor actual del control = " & ospnEdad.spinValue End Sub
Este control acepta la vinculación con una celda (ValueBinding), así como la activación y desactivación (Enabled), también el envío del foco, así como ocultarlo, recordando que estas dos ultimas propiedades, están accesibles desde el modo vista del control.
Barra de desplazamiento (ScrollBar)
Este control es muy similar al botón de selección (SpinButton), pero se usa para desplazamientos más grandes, por que tiene un área para de trabajo más grande, para agregar una a nuestro formulario, usamos el siguiente código.
Sub BarraDesplazamiento1() Dim oFormulario As Object Dim oBarraDesplazamiento As Object Dim oBarraDesplazamientoModelo As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) 'Creamos una nueva forma de control oBarraDesplazamiento = ThisComponent.createInstance("com.sun.star.drawing.ControlShape") 'Cambiamos su tamaño y posición Call CambiaTam( oBarraDesplazamiento, 10000, 700 ) Call CambiaPos( oBarraDesplazamiento, 3000, 15000 ) 'Creamos una nueva barra de desplazamiento oBarraDesplazamientoModelo = ThisComponent.createInstance("com.sun.star.form.component.ScrollBar") 'Establecemos su nombre oBarraDesplazamientoModelo.Name = "sbKm" 'Conectamos la forma con el nuevo control oBarraDesplazamiento.Control = oBarraDesplazamientoModelo 'Lo agregamos al formulario oFormulario.insertByIndex(0, oBarraDesplazamientoModelo) 'Agregamos la forma a la página de dibujo para que sea visible ThisComponent.getCurrentController.getActiveSheet.getDrawPage.add( oBarraDesplazamiento ) End Sub
Sus propiedades son muy similares al botón de selección (SpinButton), veamos las propiedades particulares de este control.
Sub BarraDesplazamiento2() Dim oFormulario As Object Dim osbKm As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) osbKm = oFormulario.getByName("sbKm") With osbKm .BlockIncrement = 25 'Cambio grande .LineIncrement = 5 'Cambio pequeño .ScrollValueMin = 1 'Valor mínimo .ScrollValueMax = 1000 'Valor máximo End With End Sub
El cambio grande (BlockIncrement) se da cuando presionamos un área libre de la barra de desplazamiento y el cambio pequeño (LineIncrement) cuando presionamos las flechas de los extremos. Para conocer el valor actual de la barra de desplazamiento, usamos.
Sub BarraDesplazamiento3() Dim oFormulario As Object Dim osbKm As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) osbKm = oFormulario.getByName("sbKm") MsgBox "Valor actual = " & osbKm.ScrollValue End Sub
Este control acepta la vinculación con una celda (ValueBinding), así como la activación y desactivación (Enabled), el envío del foco, así como ocultarlo, se tienen que establecer desde el modo vista del control.
Otros controles
Hasta aquí, hemos visto los controles estándar presentes en la barra Campos de control de formularios, pero existen otro conjunto de controles que podemos usar y a los cuales tenemos acceso desde la barra de herramientas Campos de control de formulario, como se muestra en la siguiente imagen.
Estos controles amplían las posibilidades para mostrar y controlar nuestros datos, veamos las principales características de cada uno.
Botón gráfico (ImageButton)
Este control nos permite tener una imagen como fondo de él.
Sub BotonGrafico1() Dim oFormulario As Object Dim oNuevoControl As Object Dim oNuevoControlModelo As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oNuevoControl = ThisComponent.createInstance("com.sun.star.drawing.ControlShape") Call CambiaTam( oNuevoControl, 5000, 5000 ) Call CambiaPos( oNuevoControl, 2000, 17000 ) 'Agregamos un nuevo botón gráfico oNuevoControlModelo = ThisComponent.createInstance("com.sun.star.form.component.ImageButton") oNuevoControlModelo.Name = "ibFoto" oNuevoControl.Control = oNuevoControlModelo oFormulario.insertByIndex(0, oNuevoControlModelo) ThisComponent.getCurrentController.getActiveSheet.getDrawPage.add( oNuevoControl ) End Sub
Y sus principales propiedades.
Sub BotonGrafico2() Dim oFormulario As Object Dim oControl As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oControl = oFormulario.getByName("ibFoto") With oControl .ImageURL = ConvertToURL("/home/mau/foto.jpg") 'La ruta de la imagen a mostrar .ScaleImage = True 'Si se va a escalar la imagen .ScaleMode = 2 'El modo de escalar ( 2 = Ajustar al control) End With End Sub
En su modo vista, podemos habilitar o deshabilitarlo, así como hacerlo invisible o enviarle el foco.
Control de imagen (ImageControl)
Este control es muy similar al botón gráfico (ImageButton), la diferencia, es que a este control le puedes asignar el campo de una fuente de datos (DataField), si el campo es una imagen, la mostrará en el control. Para agregar uno al formulario, usamos.
Sub ControlImagen1() Dim oFormulario As Object Dim oNuevoControl As Object Dim oNuevoControlModelo As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oNuevoControl = ThisComponent.createInstance("com.sun.star.drawing.ControlShape") Call CambiaTam( oNuevoControl, 6000, 6000 ) Call CambiaPos( oNuevoControl, 2000, 18000 ) 'Agregamos un nuevo control de imagen oNuevoControlModelo = ThisComponent.createInstance( "com.sun.star.form.component.DatabaseImageControl") oNuevoControlModelo.Name = "icProductos" oNuevoControl.Control = oNuevoControlModelo oFormulario.insertByIndex(0, oNuevoControlModelo) ThisComponent.getCurrentController.getActiveSheet.getDrawPage.add( oNuevoControl ) End Sub
Puedes asignarle una imagen de forma dinámica.
Sub ControlImagen2() Dim oFormulario As Object Dim oControl As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oControl = oFormulario.getByName("icProductos") With oControl .ImageURL = ConvertToURL("/home/mau/foto.jpg") 'La ruta de la imagen a mostrar .ScaleImage = True 'Si se va a escalar la imagen .ScaleMode = 2 'El modo de escalar ( 2 = Ajustar al control) End With End Sub
En el modo vista, puedes enviarle el foco, deshabilitarlo y hacerlo invisible.
Selección de archivo (FileSelection)
Control que nos permite mostrar el cuadro de dialogo común para seleccionar un archivo, solo te devuelve la ruta del archivo, no el archivo en si, para agregar un nuevo control, usamos.
Sub SeleccionArchivo1() Dim oFormulario As Object Dim oNuevoControl As Object Dim oNuevoControlModelo As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oNuevoControl = ThisComponent.createInstance("com.sun.star.drawing.ControlShape") Call CambiaTam( oNuevoControl, 10000, 700 ) Call CambiaPos( oNuevoControl, 2000, 18000 ) 'Agregamos un nuevo control de selección de archivo oNuevoControlModelo = ThisComponent.createInstance("com.sun.star.form.component.FileControl") oNuevoControlModelo.Name = "fcArchivo" oNuevoControl.Control = oNuevoControlModelo oFormulario.insertByIndex(0, oNuevoControlModelo) ThisComponent.getCurrentController.getActiveSheet.getDrawPage.add( oNuevoControl ) End Sub
Al contar con un área de texto, puedes usar la mayor parte de las propiedades vistas para los controles que aceptan cadenas (fuente, tamaño, color, etc), puedes establecer una ruta por defecto, de este modo, cuando se abra el dialogo, se abrirá en este directorio.
Sub SeleccionArchivo2() Dim oFormulario As Object Dim oControl As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oControl = oFormulario.getByName("fcArchivo") oControl.DefaultText = "/home/mau" End Sub
Para devolver el archivo seleccionado, se usa su propiedad Text.
Sub SeleccionArchivo3() Dim oFormulario As Object Dim oControl As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oControl = oFormulario.getByName("fcArchivo") MsgBox "Archivo seleccionado: " & oControl.Text End Sub
Puede recibir el foco y hacerse invisible a través del modo vista.
Campo de fecha (DateField)
Este control nos permite trabajar con fechas de una forma muy sencilla, incluso podemos mostrar un calendario para seleccionar fechas. Se agrega de la siguiente manera.
Sub CampoFecha1() Dim oFormulario As Object Dim oNuevoControl As Object Dim oNuevoControlModelo As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oNuevoControl = ThisComponent.createInstance("com.sun.star.drawing.ControlShape") Call CambiaTam( oNuevoControl, 5000, 700 ) Call CambiaPos( oNuevoControl, 2000, 18000 ) 'Agregamos un nuevo campo de fecha oNuevoControlModelo = ThisComponent.createInstance("com.sun.star.form.component.DateField") oNuevoControlModelo.Name = "dfNacimiento" oNuevoControl.Control = oNuevoControlModelo oFormulario.insertByIndex(0, oNuevoControlModelo) ThisComponent.getCurrentController.getActiveSheet.getDrawPage.add( oNuevoControl ) End Sub
Al ser un campo con texto, en formato de fecha pero no deja de ser texto, cuenta con toda las propiedades para manipularlo (color, tamaño, fuente, etc), ya vistas en otros controles. Veamos las propiedades particulares de este control.
Sub CampoFecha2() Dim oFormulario As Object Dim oControl As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oControl = oFormulario.getByName("dfNacimiento") With oControl .DateMin = 19000101 'Fecha mínima .DateMax = 20091231 'Fecha máxima .DateFormat = 0 'Formato mostrado .Dropdown = True 'Si es desplegable .Spin = True 'Si muestra el campo giratorio End With End Sub
Observa la forma sui generis de establecer los valores de las propiedades para el valor de la fecha mínima (DateMin) y máxima (DateMax) del control, es un número, pero primero va el año, después el mes y por ultimo el día, si las vas a establecer de forma dinámica, puedes hacerlo a través de una cadena (string), pero tienes que darle el formato exacto, si no, te dará fechas erróneas.
.DateMax = Format(Now,"YYYYMMDD")
La propiedad para mostrar la flecha desplegable (Dropdown), permite al usuario mostrar un calendario para seleccionar la fecha. La propiedad para establecer el formato (DateFormat), puedes tomar los siguientes valores enteros.
Nombre | Valor | Ejemplo |
---|---|---|
Estándar (corto) | 0 | 20/09/09 |
Estándar (corto YY) | 1 | 20/09/09 |
Estándar (corto YYYY) | 2 | 20/09/2009 |
Estándar (largo) | 3 | domingo 20 de septiembre de 2009 |
DD/MM/YY | 4 | 20/09/09 |
MM/DD/YY | 5 | 09/20/09 |
YY/MM/DD | 6 | 09/09/20 |
DD/MM/YYYY | 7 | 20/09/2009 |
MM/DD/YYYY | 8 | 09/20/2009 |
YYYY/MM/DD | 9 | 2009/09/20 |
YY-MM-DD | 10 | 09-09-20 |
YYYY-MM-DD | 11 | 2009-09-20 |
Para obtener la fecha actual del control puedes hacerlo de dos maneras.
Sub CampoFecha3() Dim oFormulario As Object Dim oControl As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oControl = oFormulario.getByName("dfNacimiento") 'Devuelve la fecha seleccionada como número MsgBox oControl.Date 'Devuelve el contenido del control como texto MsgBox oControl.Text End Sub
Dependiendo del formato que hayas establecido, te será más conveniente usar una u otra forma, esto será en función de tus necesidades.
En su modo de vista, puedes activarlo o desactivarlo (Enabled) y hacerlo invisible. Puedes vincularlo a un campo de datos origen (DataField), pero no implementa la posibilidad de vincularlo a una celda, pero más adelante aprenderemos a hacerlo directamente con código.
Campo de hora (TimeField)
Este control es muy similar al campo de fecha (DateField) pero para manejar valores de hora, veamos como agregar uno nuevo en nuestro formulario.
Sub CampoHora1() Dim oFormulario As Object Dim oNuevoControl As Object Dim oNuevoControlModelo As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oNuevoControl = ThisComponent.createInstance("com.sun.star.drawing.ControlShape") Call CambiaTam( oNuevoControl, 5000, 700 ) Call CambiaPos( oNuevoControl, 2000, 20000 ) 'Agregamos un nuevo campo de hora oNuevoControlModelo = ThisComponent.createInstance("com.sun.star.form.component.TimeField") oNuevoControlModelo.Name = "tfEntrada" oNuevoControl.Control = oNuevoControlModelo oFormulario.insertByIndex(0, oNuevoControlModelo) ThisComponent.getCurrentController.getActiveSheet.getDrawPage.add( oNuevoControl ) End Sub
Y sus propiedades particulares.
Sub CampoHora2() Dim oFormulario As Object Dim oControl As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oControl = oFormulario.getByName("tfEntrada") With oControl .TimeMin = 8300000 'La hora mínima 8:30 .TimeMax = 15000000 'La hora máxima 15:00 .TimeFormat = 1 '24 hr con segundos .Spin = True 'Muestra el control giratorio End With End Sub
El formato para la hora mínima (TimeMin) y máxima (TimeMax), tiene que ser HoraMinutosSegundos, y los segundos debe ser cuatro dígitos, el formato solo acepta cuatro valores; formato 24 horas sin segundos (0), formato 24 horas con segundos (1), formato 12 horas sin segundos (3) y formato 12 horas con segundos (4). Para recuperar el valor actual del control, tienes dos opciones.
Sub CampoHora3() Dim oFormulario As Object Dim oControl As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oControl = oFormulario.getByName("tfEntrada") 'Devuelve la fecha seleccionada como número MsgBox oControl.Time 'Devuelve el contenido del control como texto MsgBox oControl.Text End Sub
En su modo de vista, puedes activarlo o desactivarlo (Enabled) y hacerlo invisible. Puedes vincularlo a un campo de datos origen (DataField), pero no implementa la posibilidad de vincularlo a una celda.
Campo numérico (NumericField)
Este control permite manejar únicamente números, en el siguiente ejemplo agregamos un nuevo control al formulario.
Sub CampoNumerico1() Dim oFormulario As Object Dim oNuevoControl As Object Dim oNuevoControlModelo As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oNuevoControl = ThisComponent.createInstance("com.sun.star.drawing.ControlShape") Call CambiaTam( oNuevoControl, 5000, 700 ) Call CambiaPos( oNuevoControl, 2000, 20000 ) 'Agregamos un nuevo campo numérico oNuevoControlModelo = ThisComponent.createInstance("com.sun.star.form.component.NumericField") oNuevoControlModelo.Name = "nfPesos" oNuevoControl.Control = oNuevoControlModelo oFormulario.insertByIndex(0, oNuevoControlModelo) ThisComponent.getCurrentController.getActiveSheet.getDrawPage.add( oNuevoControl ) End Sub
Recuerda que todos los controles donde se muestre información al usuario, comparten un mínimo de propiedades (color, fuente, etc). Las propiedades particulares de este control son.
Sub CampoNumerico2() Dim oFormulario As Object Dim oControl As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oControl = oFormulario.getByName("nfPesos") With oControl .ValueMin = 100 'El valor mínimo .ValueMax = 500 'El valor máximo .ValueStep = 2 'El salto entre valores .Spin = True 'Si muestra el control giratorio .ShowThousandsSeparator = True 'Si muestra el separador de miles .DecimalAccuracy = 2 'El número de decimales End With End Sub
El separador de miles (ShowThousandsSeparator), será el mismo configurado en la interfaz del OOo.
Sub CampoNumerico3() Dim oFormulario As Object Dim oControl As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oControl = oFormulario.getByName("nfPesos") 'Devolvemos el valor del control MsgBox "El valor actual del control es = " & oControl.Value End Sub
Este control si acepta la vinculación con una celda, así como con un campo de datos.
Campo moneda (CurrencyField)
Este control es casi idéntico al campo numérico (NumericField), con al diferencia de que puede mostrar un símbolo de moneda en su formato. Para agregar un control de este tipo a nuestro formulario, usamos el siguiente código.
Sub CampoMoneda1() Dim oFormulario As Object Dim oNuevoControl As Object Dim oNuevoControlModelo As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oNuevoControl = ThisComponent.createInstance("com.sun.star.drawing.ControlShape") Call CambiaTam( oNuevoControl, 5000, 700 ) Call CambiaPos( oNuevoControl, 2000, 20000 ) 'Agregamos un nuevo campo moneda oNuevoControlModelo = ThisComponent.createInstance("com.sun.star.form.component.CurrencyField") oNuevoControlModelo.Name = "cfIngresos" oNuevoControl.Control = oNuevoControlModelo oFormulario.insertByIndex(0, oNuevoControlModelo) ThisComponent.getCurrentController.getActiveSheet.getDrawPage.add( oNuevoControl ) End Sub
Las propiedades particulares de este control son.
Sub CampoMoneda2() Dim oFormulario As Object Dim oControl As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oControl = oFormulario.getByName("cfIngresos") With oControl .CurrencySymbol = "B$" 'El símbolo de moneda .PrependCurrencySymbol = True 'Muestra el símbolo a la izquierda .ValueMin = 0 'El valor mínimo .ValueMax = 1000 'El valor máximo .ValueStep = 5 'El salto entre valores .Spin = True 'Si muestra el control giratorio .ShowThousandsSeparator = True 'Si muestra el separador de miles .DecimalAccuracy = 2 'El número de decimales End With End Sub
Para recuperar el valor actual del control usamos.
Sub CampoMoneda3() Dim oFormulario As Object Dim oControl As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oControl = oFormulario.getByName("cfIngresos") 'Devolvemos el valor del control MsgBox "El valor actual del control es = " & oControl.Value End Sub
Este control solo acepta el vinculo con un campo de datos.
Campo enmascarado (PatternField)
Este control permite establecer una mascara de entrada para los datos del usuario, es muy útil en entornos con usuarios con poca experiencia, pues permite limitar de forma muy estricta lo que este captura, para agregar uno a nuestro formulario, usamos.
Sub CampoEnmascarado1() Dim oFormulario As Object Dim oNuevoControl As Object Dim oNuevoControlModelo As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oNuevoControl = ThisComponent.createInstance("com.sun.star.drawing.ControlShape") Call CambiaTam( oNuevoControl, 5000, 700 ) Call CambiaPos( oNuevoControl, 2000, 20000 ) 'Agregamos un nuevo campo enmascarado oNuevoControlModelo = ThisComponent.createInstance("com.sun.star.form.component.PatternField") oNuevoControlModelo.Name = "pfRFC" oNuevoControl.Control = oNuevoControlModelo oFormulario.insertByIndex(0, oNuevoControlModelo) ThisComponent.getCurrentController.getActiveSheet.getDrawPage.add( oNuevoControl ) End Sub
Este control tiene pocas propiedades particulares, pero son vitales para su correcto funcionamiento.
Sub CampoEnmascarado2() Dim oFormulario As Object Dim oControl As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oControl = oFormulario.getByName("pfRFC") With oControl .MaxTextLen = 15 'Longitud máxima del contenido .EditMask = "AAAALNNNNNNLCCC" 'Mascara de entrada .LiteralMask = "____-______-___" 'Mascara de caracteres .StrictFormat = True 'Control de formato End With End Sub
Estas cuatro propiedades, es esencial que trabajen todas juntas, la primera es autodescriptiva pero es muy importante que tenga la longitud exacta de la mascara de entrada (EditMask) y de la mascara de caracteres (LiteralMask), para que funcione el control de formato (StrictFormat) debe estar en verdadero esta propiedad. En la mascará de entrada (EditMask) determinamos que puede y que no puede capturar el usuario en esa exacta posición del carácter, de acuerdo a la siguiente tabla.
Carácter</center> | Restricción</center> |
---|---|
L | El carácter de esta posición, se muestra tal cual, no puede editarse, al llegar a esta posición, el cursor pasa al siguiente carácter editable. |
a | Se permiten letras de la “A” a la “Z”, se respetan mayúsculas y minúsculas. |
A | Se permiten letras de la “A” a la “Z”, todas se convierten a mayúsculas. |
c | Se permiten letras de la “A” a la “Z”, y todos los dígitos, 0-9, se respetan mayúsculas y minúsculas. |
C | Se permiten letras de la “A” a la “Z”, y todos los dígitos, 0-9, todas las letras pasan a mayúsculas. |
N | Solo se permiten los números dígitos, 0 a 9. |
X | Se permiten todos los caracteres imprimibles. |
La mascara de caracteres, es lo que ve el usuario, mientras no capture nada en las respectivas posiciones.
Posición | 123456789012345 |
Mascara de entrada | AAAALNNNNNNLCCC |
Mascara de caracteres | ____-______-___ |
Para regresar el valor capturado, usamos.
Sub CampoEnmascarado3() Dim oFormulario As Object Dim oControl As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oControl = oFormulario.getByName("pfRFC") MsgBox "Valor actual del control: " & oControl.Text End Sub
Este control soporta la vinculación con un campo de datos (DataField).
Cuadro de grupo (GroupBox)
Este control solo es de apoyo visual para enmarcar otros grupos de controles, generalmente se usa con grupos de botones de opción (OptionButton) aunque los puedes usar con cualquier otro grupo de controles. Para agregar uno al formulario, usamos.
Sub CuadroGrupo1() Dim oFormulario As Object Dim oNuevoControl As Object Dim oNuevoControlModelo As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oNuevoControl = ThisComponent.createInstance("com.sun.star.drawing.ControlShape") Call CambiaTam( oNuevoControl, 5000, 5000 ) Call CambiaPos( oNuevoControl, 2000, 20000 ) 'Agregamos un nuevo campo enmascarado oNuevoControlModelo = ThisComponent.createInstance("com.sun.star.form.component.GroupBox") oNuevoControlModelo.Name = "gbEstadoCivil" oNuevoControl.Control = oNuevoControlModelo oFormulario.insertByIndex(0, oNuevoControlModelo) ThisComponent.getCurrentController.getActiveSheet.getDrawPage.add( oNuevoControl ) End Sub
Para establecer el titulo del control usamos.
Sub CuadroGrupo2() Dim oFormulario As Object Dim oControl As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oControl = oFormulario.getByName("gbEstadoCivil") 'Establecemos el titulo del control oControl.Label = "Estado civil" End Sub
Control de tablas (TableControl)
Este control nos permite mostrar una tabla, consulta o instrucción SQL para enlazar bases de datos, por ahora solo funciona en tiempo de diseño y el asistente de controles debe estar activado, el formulario previamente debe estar enlazado con los datos origen, para agregar una al formulario, usamos el siguiente código, pero, por ahora, no podrás enlazarlo por código.
Sub TablaControl1() Dim oFormulario As Object Dim oNuevoControl As Object Dim oNuevoControlModelo As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oNuevoControl = ThisComponent.createInstance("com.sun.star.drawing.ControlShape") Call CambiaTam( oNuevoControl, 10000, 10000 ) Call CambiaPos( oNuevoControl, 3000, 20000 ) 'Agregamos un nuevo campo enmascarado oNuevoControlModelo = ThisComponent.createInstance("com.sun.star.form.component.GridControl") oNuevoControlModelo.Name = "gcContactos" oNuevoControl.Control = oNuevoControlModelo oFormulario.insertByIndex(0, oNuevoControlModelo) ThisComponent.getCurrentController.getActiveSheet.getDrawPage.add( oNuevoControl ) End Sub
Este control permite, cuando el formulario esta enlazado a una base de datos, controlar la navegación entre los registros, para agregarla al formulario usamos.
Sub BarraNavegacion1() Dim oFormulario As Object Dim oNuevoControl As Object Dim oNuevoControlModelo As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oNuevoControl = ThisComponent.createInstance("com.sun.star.drawing.ControlShape") Call CambiaTam( oNuevoControl, 20000, 1000 ) Call CambiaPos( oNuevoControl, 3000, 25000 ) 'Agregamos un nuevo campo enmascarado oNuevoControlModelo = ThisComponent.createInstance("com.sun.star.form.component.NavigationToolBar") oNuevoControlModelo.Name = "navBarra" oNuevoControl.Control = oNuevoControlModelo oFormulario.insertByIndex(0, oNuevoControlModelo) ThisComponent.getCurrentController.getActiveSheet.getDrawPage.add( oNuevoControl ) End Sub
Las propiedades particulares de este control son.
Sub BarraNavegacion2() Dim oFormulario As Object Dim oControl As Object oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName( "MiDirectorio" ) oControl = oFormulario.getByName("navBarra") With oControl .BackgroundColor = RGB(Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255) 'Color de fondo .TextColor = RGB(Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255,Rnd<nowiki>*</nowiki>255) 'Color de texto .Border = 2 'Borde plano .IconSize = 0 'Pequeño = 0, Grande = 1 .ShowPosition = True 'Muestra la información actual del cursor .ShowNavigation = True 'Muestra las flechas de navegación .ShowRecordActions = True 'Muestra los iconos para manipular registros .ShowFilterSort = True 'Muestra los iconos para ordenar y filtrar End With End Sub
Si estableces las ultimas cuatro propiedades en falso (False), solo veras un marco sin ninguna utilidad, generalmente se muestran los cuatro, el icono para manipular los registros (ShowRecordActions), te permite, agregar, editar y borrar registros, en ocasiones es útil deshabilitar estos y controlar estas acciones por código, esto te permite un mayor control de los datos, pero requiere, también, muchas más líneas de código, y trabajo, por supuesto, tu decides que es lo que más te conviene.
Con esto terminamos con el manejo de formularios y sus controles, hemos visto la forma de agregarlos por código y manipular las principales propiedades de cada uno, casi todo el conocimiento adquirido en este capitulo, nos será de mucha utilidad para el siguiente, en donde aprenderemos el manejo de cuadros de diálogo.
Si tienes dudas acerca de lo aquí explicado, tienes algún problema con AOO, o quieres ampliar la información, no dudes en dirigirte al Foro Oficial en español de Apache OpenOffice para Macros y API UNO |