Trabajando con formularios

From Apache OpenOffice Wiki
< ES‎ | Manuales‎ | GuiaAOO‎ | TemasAvanzados‎ | Macros‎ | StarBasic
Jump to: navigation, search


Editing.png Esta página está en estado borrador.

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.

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.


ES StarBasic TrabajandoConFormularios.02.png


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.


ES StarBasic TrabajandoConFormularios.01.png


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


Barra de navegación

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.


ES.Plantillas.Logo foro es.png
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

Personal tools