Trabajando con cuadros de diálogo

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


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

Los cuadros de diálogo son similares a los formularios, se diferencian en que estos se muestran en una ventana independiente y los formularios están incrustados en la hoja de calculo, también, con los formularios se puede interactuar con las celdas y los controles directamente así como vincularlos, los cuadros de diálogo, al estar dentro de su ventana, es preciso cerrarla primero para regresar a la hoja de calculo, otra diferencia importante es que los formularios están más orientados a la interacción con orígenes de datos, pues cuentan con propiedades y características especiales para ello, los cuadros de diálogo son más de propósito general aunque con un poco de ingenio también los puedes poner a trabajar como si de una interfaz de datos se tratara. Los controles disponibles para los cuadros de diálogo son en su mayoría, los mismos que ya hemos visto en los formularios por lo que solo nos centraremos en las diferencias importantes.


Para agregar un cuadro de diálogo tenemos dos formas, la primera: ve al menú Herramientas > Macros > Organizar Macros > OpenOffice.org Basic..., que te mostrará.


ES StarBasic TrabajandoCuadrosDialogo.12.png


Da un clic en el botón de comando Administrar..., tienes que seleccionar la ficha Diálogos (1), después, el archivo y la biblioteca donde quieras agregar el nuevo cuadro de diálogo (2), por ultimo, da un clic al botón de comando Nuevo... (3).


ES StarBasic TrabajandoCuadrosDialogo.11.png


Donde puedes establecer el nombre del nuevo cuadro de diálogo, para nuestro ejemplo miDialogo está bien. Generalmente el nombre del cuadro de diálogo va en relación al trabajo para el cual lo usaremos y este nombre, sigue las mismas premisas para nombrar las variables. Debes de recordar que en tiempo de ejecución el nombre distingue mayúsculas de minúsculas. Después de establecer el nombre, da un clic en el botón de comando Aceptar, para regresar al cuadro de diálogo anterior, donde podrás ver ya, nuestro nuevo cuadro de diálogo.


ES StarBasic TrabajandoCuadrosDialogo.10.png


Donde podemos ver el nuevo cuadro de diálogo (1), solo nos resta darle clic en el botón de comando Editar (2), para que nos lleve a nuestro conocido y ya buen amigo IDE, que es donde diseñaremos el contenido y estructura de nuestro flamante cuadro de diálogo (1).


ES StarBasic TrabajandoCuadrosDialogo.09.png


Incluso, ya lo puedes probar con el icono de Activar o desactivar modo de prueba (2).


ES StarBasic TrabajandoCuadrosDialogo.08.png


Si no ves la barra de herramientas de controles, actívala desde el menú Ver > Barras de Herramientas.


La segunda forma de agregar un cuadro de diálogo, es desde el mismo IDE, en al área de pestañas de los módulos, da un clic con el botón secundario del ratón, para ver.


ES StarBasic TrabajandoCuadrosDialogo.07.png


Cuando agregas un nuevo cuadro de diálogo, de forma predeterminada se posiciona en el centro de la ventana de trabajo, para moverlo tienes que seleccionarlo desde cualquier borde de el, ten cuidado por que este borde es un poco pequeño y si eres como yo, poco hábil con el ratón, las primeras veces es un poco difícil, no quiero contarte cuanto tiempo estuve peleándome para averiguar como se movía de posición el cuadro de diálogo pues intentaba arrastrarlo del centro.


Tanto para seleccionarlo, cambiarlo de posición y de tamaño se hace desde el borde de este, te darás cuenta que ha sido seleccionado porque veras sus nodos verdes para manipularlo, para cambiar de tamaño, arrastra cualquier de los ocho nodos verdes, para cambiar de posición, arrastra desde cualquier borde donde no haya algún nodo verde.


ES StarBasic TrabajandoCuadrosDialogo.06.png


Los controles que agregues al cuadro de diálogo, no están anclados a el, es decir, si mueves el cuadro de diálogo, solo se moverá este, para mover todo el contenido, con el ratón, arrastra desde una esquina a la esquina contraria, pero cuidado, tienes que hacerlo, desde fuera del cuadro de diálogo, de modo que abarques todo el contenido, ahora si, puedes mover el cuadro de diálogo y sus controles. El icono de prueba solo te sirve para verlo como lo verá el usuario, pero no funcionará ningún código que este asociado a los controles.


Para mostrar un cuadro de diálogo por código, usamos.


 Sub EjecutarMiDialogo1()
 Dim oDialogo As Object
 
     'Cargamos la librería Standard en memoria
     DialogLibraries.LoadLibrary( "Standard" )
     'Cargamos el cuadro de diálogo en memoria
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("miDialogo") )
     'Lo ejecutamos (mostramos)
     oDialogo.execute()
     'Lo liberamos de memoria
     oDialogo.dispose()
 
 End Sub


La función CreateUnoDialog forma parte del OOo Basic y se encarga de crear y asignar el cuadro de diálogo en memoria en tiempo de ejecución. Es importante que primer cargues en memoria (LoadLibrary) la librería donde esta el cuadro de diálogo, si no, te dará un error en tiempo de ejecución, sobre todo cuando muestras cuadros de diálogo al abrir archivos, como aprenderemos más adelante. La variable de objeto DialogLibraries, siempre apunta a la librería de diálogos desde donde se llame la macro, el nombre de la librería debe existir dentro de dicha variable, lo cual siempre puedes verificar.


     Msgbox DialogLibraries.hasByName("Standard")


El método para mostrar el cuadro de diálogo (execute), te puede devolver un valor, como también comprobaremos más adelante, es importante que sepas que mientras el cuadro de diálogo este abierto, la línea de ejecución permanecerá en la línea donde se llame a este método, como puedes comprobarlo en el siguiente ejemplo.


 Sub EjecutarMiDialogo2()
 Dim oDialogo As Object
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("miDialogo") )
     MsgBox "Estas apunto de mostrar un cuadro de diálogo"
     oDialogo.execute()
     MsgBox "Has cerrado el cuadro de diálogo"    
     oDialogo.dispose()
 
 End Sub


Observa que el segundo mensaje, no se muestra hasta que cierras el cuadro de diálogo. Dentro de las macros predeterminadas que incorpora OOo, existe una función especial para cargar cuadros de diálogo, se llama LoadDialog y esta en la librería Tools, la cual, por supuesto, debes cargar primero para poder usar la función, como en el siguiente ejemplo.


 Sub EjecutarMiDialogo3()
 Dim oDialogo As Object
 
     'Cargamos la librería incorporada Tools de OOo
     GlobalScope.BasicLibraries.LoadLibrary("Tools")
     'Cargamos el cuadro de diálogo usando la función LoadDialog
     oDialogo = LoadDialog("Standard", "miDialogo", DialogLibraries )
     'Mostramos
     oDialogo.execute()
     'Liberamos
     oDialogo.dispose()
 
 End Sub


Usa el método que gustes, pero siempre asegúrate de que todos los objetos existan. Vamos a cambiar algunas propiedades del cuadro de diálogo.


 Sub EjecutarMiDialogoo4()
 Dim oDialogo As Object
 Dim oDialogoModelo As Object
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("miDialogo") )
 
     'Accedemos al modelo del objeto
     oDialogoModelo = oDialogo.getModel()
     With oDialogoModelo 
         .Title = "Mi nuevo cuadro de diálogo"                'El titulo del cuadro de diálogo
         .BackgroundColor = RGB(Rnd*255,Rnd*255,Rnd*255)        'El color de fondo
         .PositionX = 100                                'Posición desde la izquierda
         .PositionY = 100                                'Posición desde la parte superior
         .Width = 200                                'El ancho
         .Height = 200                                'El alto
     End With
 
     oDialogo.execute()
     oDialogo.dispose()    
 
 End Sub


Es importa que recuerdes que estas propiedades solo se establecen en tiempo de ejecución, es decir, reemplazan temporalmente a las establecidas en tiempo de diseño, pero quedan sin efecto al cerrar el cuadro de diálogo. La posición predeterminada del cuadro de diálogo al mostrarse, será la que establezcas en el IDE. La unidad para la posición en X (PositionX), posición en Y (PositionY), el ancho (Width) y el alto (Height), es píxeles, por lo que estarán determinadas por la resolución de tu pantalla, la posición del objeto, va en relación con el extremo superior izquierdo del documento que lo contiene, no de la pantalla. También puedes establecer una imagen como fondo, si lo haces, veras la imagen, pero no el color de fondo.


 Sub EjecutarMiDialogo5()
 Dim oDialogo As Object
 Dim oDialogoModelo As Object
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("miDialogo") )
 
     'Accedemos al modelo del objeto
     oDialogoModelo = oDialogo.getModel()
     With oDialogoModelo 
         .Title = "Mi novia"    
         .ImageURL = ConvertToUrl("/home/mau/foto.jpg")    'Imagen de fondo
     End With
     oDialogo.execute()
     oDialogo.dispose()    
 End Sub


ES StarBasic TrabajandoCuadrosDialogo.05.png


Todos los controles que veremos aquí, los agregaremos de forma manual de la misma forma. Primero seleccionamos el control deseado (1), lo dibujamos dentro del cuadro de diálogo (2), puedes seguir agregando más controles del mismo tipo, cambiar de control o seleccionar el control recién agregado (2). Con el control seleccionado, puedes mostrar sus propiedades con el botón secundario del ratón o con el icono de propiedades (3) de la barra de herramientas.


ES StarBasic TrabajandoCuadrosDialogo.04.png


La ventana de propiedades, nos permite hacer dos cosas, establecer la mayoría de las propiedades (1) iniciales para el control (incluyendo los cuadros de diálogo) y establecer las macros que asociaremos a sus acontecimientos (2), también llamados eventos, lo cual aprenderemos en el siguiente capítulo. Una propiedad muy importante de cualquier control, es su nombre (3) ya que este será el que usaremos para hacer referencia a el en tiempo de ejecución, otras son lo que verá el usuario (4) y otras determinarán su apariencia y comportamiento.


ES StarBasic TrabajandoCuadrosDialogo.03.png


Para acceder a un control dentro de un formulario, usamos su nombre (3) de la siguiente forma.


 Sub EjecutarMiDialogo6()
 Dim oDialogo As Object
 Dim oDialogoModelo As Object
 Dim ocmdAceptar As Object
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("miDialogo") )
 
     'Referencia al botón de comando cmdAceptar
     ocmdAceptar = oDialogo.getControl("cmdAceptar")
     'Cambiamos su titulo
     ocmdAceptar.Label = "Cerrar"
 
     oDialogo.execute()
     oDialogo.dispose()    
 
 End Sub


Si el control no existe, al tratar de hacer referencia a el en una variable, no te dará ningún error, el error te lo dará hasta que trates de establecer alguna propiedad y esta no exista.


     'Aquí no te dará error
     ocmdAceptar = oDialogo.getControl("NoExisto")
     'Te dará el error aquí
     ocmdAceptar.Label = "Cerrar"


Lo común es que, al tu establecer el nombre del control al agregarlo manualmente al control de diálogo, no tengas problemas con los nombres en el código, aun así, si necesitas establecerlo desde alguna otra fuente, puedes verificar que exista el control, antes de establecerlo a la variable, como en el siguiente ejemplo.


 Sub EjecutarMiDialogo7()
 Dim oDialogo As Object
 Dim ocmdAceptar As Object
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("miDialogo") )
 
     'Verificamos que exista el control
     If oDialogo.getModel.hasByName("NoExisto") Then
         ocmdAceptar = oDialogo.getControl("NoExisto")
         'Cambiamos su titulo
         ocmdAceptar.Label = "Cerrar"
         oDialogo.execute()
         oDialogo.dispose()    
     Else
         MsgBox "El control no existe"    
     End If
 
 End Sub


Observa que el método para consultar la existencia de un elemento del conjunto (hasByName), esta en el modelo del objeto, en el capítulo anterior, con la referencia directa a un objeto de un formulario, teníamos el modelo de este y para acceder al modo vista, teníamos que hacerlo enlazando con el controlador del contender, es decir, del documento.


     otxtNombre = oFormulario.getByName("txtNombre")
     'Accedemos a la vista del control
     otxtNombreVista = oDoc.getCurrentController.getControl( otxtNombre )


En los cuadro de diálogo es al revés, la referencia directa al control se establece en modo vista y si queremos acceder al modelo tenemos que hacerlo de forma explicita.


 Sub EjecutarMiDialogo8()
 Dim oDialogo As Object
 Dim ocmdAceptar As Object
 Dim ocmdAceptarModelo As Object
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("miDialogo") )
 
     ocmdAceptar = oDialogo.getControl("cmdAceptar")
     'Accedemos al modelo del objeto
     ocmdAceptarModelo = ocmdAceptar.'''getModel'''()
     'Establecemos el título
     ocmdAceptarModelo.Label = "Cerrar"
 
     oDialogo.execute()
     oDialogo.dispose()    
 
 End Sub


Solo que aquí es de una forma más sencilla, pues hay un método especifico para ello (getModel), puedes usar una nueva variable o acceder a través de este método directamente.


La mayoría de las propiedades y métodos de los controles vistos en el capítulo de los formularios, son aplicables a los controles de los cuadros de diálogo, la mayoría de las cuales no repetiremos aquí, solo repasaremos las más importantes, las que tengan un uso o aplicación diferente y algún nuevo control presente solo en los cuadros de diálogo, también, recuerda que cada control debes de agregarlo de forma manual a nuestro cuadro de diálogo de trabajo. La gran mayoría de las propiedades de los controles que veremos, por lo regular se establecen en tiempo de diseño, se muestran en tiempo de ejecución para comprobar que es posible manipularlas, pero lo común es que pocas de ellas cambien durante el desarrollo de un programa, pero estas pocas son muy útiles en diversas circunstantes como los demostraremos más adelante.



Botón de comando (CommandButton)

Agrega un segundo botón de comando y nómbralo cmdCancelar, de modo que tu cuadro de diálogo te quede de la siguiente manera.


ES StarBasic TrabajandoCuadrosDialogo.02.png


Las principales propiedades de este control son.


 Sub BotonComando1()
 Dim oDialogo As Object
 Dim ocmdBoton As Object
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("miDialogo") )
 
     ocmdBoton = oDialogo.getControl("cmdAceptar")
     With ocmdBoton.getModel
         .Align = 1                'Alineación; 0 = izquierda, 1 = centro, 2 = derecha
         .FontHeight = 12            'Tamaño de fuente
         .FontName = "FreeSans"        'Nombre de la fuente
         .ImageURL = ConvertToUrl("/home/mau/bien.jpg")    'Imagen a mostrar
         .ImagePosition = 1        'Posición 1 = centro izquierda
         .PushButtonType = 1        'Tipo de botón 1 = Aceptar
     End With
 
     ocmdBoton = oDialogo.getControl("cmdCancelar")
     With ocmdBoton.getModel
         .Align = 1                    
         .FontHeight = 12            
         .FontName = "FreeSans"        
         .ImageURL = ConvertToUrl("/home/mau/mal.jpg")        
         .ImagePosition = 1                        
         .PushButtonType = 2        'Tipo de botón 2 = Cancelar
     End With
     oDialogo.execute()
     oDialogo.dispose()    
 
 End Sub


Si estableces una imagen para el botón de comando, esta se mostrará junto con el texto para el usuario (Label), claro, esta propiedad puede estar vacía y solo mostrar la imagen.


ES StarBasic TrabajandoCuadrosDialogo.01.png


Establecer el tipo de botón (PushButtonType), nos permite asociar de forma directa, sin código, los botones a algunas teclas, si es igual a 1, este botón se presionara con la tecla entrar (Enter), si es igual a 2, el botón se ejecutará al presionar la tecla escape (Esc) además de que cerrara el cuadro de diálogo.


Establece esta propiedad, según corresponda su nombre para cada botón en tiempo de diseño, en la interfaz del usuario, esta propiedad se llama Tipo de botón y ejecuta varias veces la siguiente macro, teniendo cuidado de usar, para salir, una vez cada uno de los botones, también prueba a cerrar desde el icono de ventana.


 Sub BotonComando2()
 Dim oDialogo As Object
 Dim Res As Integer
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("miDialogo") )
 
     'El método execute, retorna un valor
     Res = oDialogo.execute()
 
     Select Case Res
         Case 0 : MsgBox "El usuario selecciono Cancelar"
         Case 1 : MsgBox "El usuario selecciono Aceptar"
     End Select
     oDialogo.dispose()    
 
 End Sub


Observa que; no hemos asociado todavía código alguno a cada botón, aun así, podemos salir del cuadro de diálogo, por que hemos establecido la propiedad Tipo de botón en tiempo de diseño, nota como ahora, asociamos el método para mostrar el cuadro de diálogo (execute) a una variable, con lo podemos saber que botón presiono el usuario, esto, es solo una técnica, otra seria usar una variable global, como aprenderemos más adelante.



Control gráfico (ImageControl)

Este control nos permite mostrar archivos de imagen, agrega uno al cuadro de diálogo desde la barra de herramientas y llámalo icFoto. Su propiedad más importante es la que nos permite establecer la imagen a mostrar.


 Sub ControlImagen1()
 Dim oDialogo As Object
 Dim oControl As Object
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("MiDialogo") )
 
     oControl = oDialogo.getControl("icFoto")
     With oControl.getModel
         .ImageURL = ConvertToUrl("/home/mau/foto2.jpg")        'Imagen a mostrar
     End With
     oDialogo.execute()
     oDialogo.dispose()    
 
 End Sub


Este control, usado en tiempo de ejecución, nos permite hacer cosas muy divertidas, como mostrar las fotos de tus contactos si estas haciendo una agenda, o la imagen de tus productos si tienes un inventario, solo por citar dos ejemplos.



Casilla de verificación (CheckBox)

Agrega un control y nómbralo chkImprimir, generalmente, este control se usa para valores de verdadero o falso, aunque tiene una propiedad para establecer hasta tres estados.


 Sub CasillaVerificacion1()
 Dim oDialogo As Object
 Dim oControl As Object
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("MiDialogo") )
 
     'El control de imagen
     oControl = oDialogo.getControl("icFoto")
     'Lo ocultamos
     oControl.Visible = False
 
     'La casilla de verificación
     oControl = oDialogo.getControl("chkImprimir")
 
     With oControl.getModel
         .TriState = True        'Estado triple
     End With
     oDialogo.execute()
     oDialogo.dispose()    
 
 End Sub


Observa como hacemos referencia al control de imagen agregado en nuestro ejemplo anterior y lo ocultamos. El estado triple de una casilla de verificación, te permite establecer tres estados a este control: seleccionado, no seleccionado y sin selección. Para recuperar su valor usamos.


 Sub CasillaVerificacion2()
 Dim oDialogo As Object
 Dim oControl As Object
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("MiDialogo") )
 
     oControl = oDialogo.getControl("chkImprimir")
     'Recuperamos el valor del control    
     Msgbox oControl.State
 
 End Sub


Nota como recuperamos el valor del control sin mostrar el cuadro de diálogo, aunque lo usual es mostrar el cuadro de diálogo para que el usuario manipule los controles y entonces si, recuperar sus valores.



Cuadro de grupo (FrameControl)

Agrega un control cuadro de grupo y llámalo fraDistribucion. Este control nos permite agrupar a otros controles, excepto para los botones de opción donde si tienen inferencia, para los demás controles solo es estético, una ayuda visual para separar grupos de controles. Sus principales propiedades son.


 Sub CuadroGrupo1()
 Dim oDialogo As Object
 Dim oControl As Object
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("MiDialogo") )
 
     'Ocultamos los controles anteriores
     oControl = oDialogo.getControl("icFoto")
     oControl.Visible = False
     oControl = oDialogo.getControl("chkImprimir")
     oControl.Visible = False
 
     'El cuadro de grupo
     oControl = oDialogo.getControl("fraDistribucion")
 
     With oControl.getModel
         .FontName = "FreeSans"            'Nombre de la fuente
         .FontHeight = 12                'Tamaño de la fuente
         .TextColor = RGB(Rnd*255,Rnd*255,Rnd*255)    'Color de la fuente
     End With
     oDialogo.execute()
     oDialogo.dispose()    
 
 End Sub


Observa como vamos ocultado los controles anteriores usados, puedes seguir ocultando los que no usemos, por ahora, o puedes hacer más grande el cuadro de diálogo para que quepan más controles, queda a tu criterio. En el capítulo anterior, formularios, para agrupar y controlar los botones de opción, era suficiente con establecerles el mismo nombre por grupo, en los cuadros de diálogo, no es posible usar el mismo nombre para más de un control, por ello, en este caso, es importante el uso de cuadros de grupo, como lo demostraremos a continuación.



Botón de opción (OptionButton)

Agrega tres controles de botón de opción (OptionButton) y nómbralos optUbuntu, optFedora y optArch. Establece el segundo como seleccionado. Es muy importante que los agregues dentro del cuadro de grupo (FrameControl) creado en el tema anterior, de modo que tengas algo así.


Para acceder al botón de opción que este seleccionado, usamos.


 Sub BotonOpcion1()
 Dim oDialogo As Object
 Dim oControl As Object
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("MiDialogo") )
 
     'Ocultamos los controles anteriores
     oControl = oDialogo.getControl("icFoto") : oControl.Visible = False
     oControl = oDialogo.getControl("chkImprimir") : oControl.Visible = False
 
     'El primero botón de opción
     oControl = oDialogo.getControl("optUbuntu")
     MsgBox oControl.State
 
     'El segundo botón de opción
     oControl = oDialogo.getControl("optFedora")
     MsgBox oControl.State
 
     'El tercer botón de opción
     oControl = oDialogo.getControl("optArch")
     MsgBox oControl.State
 
     oDialogo.execute()
     oDialogo.dispose()    
 
 End Sub


Por supuesto, ya lo notaste, si mostramos el valor (State) de los botones de opción, antes de mostrar el cuadro de diálogo, siempre tendremos el mismo botón seleccionado, el que hayas establecido como predeterminado, para este ejemplo, por ahora, solo recuerda como obtenemos el estado (State), en el siguiente capítulo, aprenderemos una forma muy elegante de como consultar el estado de grupos de botones de opción, sin tener que acceder uno por uno. Cada grupo de botones de opción que agregues, formará un grupo al cual puedes acceder por su índice, como en.


 Sub BotonOpcion2()
 Dim oDialogo As Object
 Dim oGrupo() As Object
 Dim oBoton As Object
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("MiDialogo") )
 
     'Accedemos al primer grupo de controles
     oDialogo.getModel.getGroup( 0, oGrupo, "" )
     'Iteramos en cada botón
     For Each oBoton In oGrupo()
         MsgBox oBoton.Name
     Next    
 
 End Sub


Observa como devolvemos el grupo deseado, en este caso el cero, en la variable (oGrupo) pasada como argumento al método (getGroup), esta forma regresar un valor en uno de los argumentos de la función, es muy común en la programación en C, C++ y otros lenguajes, en los derivados de Basic no es muy común, pero como ves, se presenta algunas veces.



Etiqueta (Label)

Las etiquetas, a pesar de tener la capacidad de asociarles macros, son comúnmente usadas como controles estáticos, agrega una nueva etiqueta y llámala lblTitulo. Entre otras de sus propiedades, puedes cambiar en tiempo de ejecución, las siguientes.


 Sub Etiqueta1()
 Dim oDialogo As Object
 Dim oControl As Object
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("MiDialogo") )
 
     'La etiqueta
     oControl = oDialogo.getControl("lblTitulo")    
     With oControl.getModel
         .Label = "Bienvenido al programa"            'El titulo
         .FontHeight = 18
         .TextColor = RGB(Rnd*255,Rnd*255,Rnd*255)
     End With        
     oDialogo.execute()
     oDialogo.dispose()    
 
 End Sub


En no pocas ocasiones, puedes usar una etiqueta para mostrar ayuda contextual al usuario de forma dinámica.



Campo de texto (TextField)

Agrega un control de cuadro de texto y llámalo txtNombre. Estos controles son los más comúnmente usados para que el usuario introduzca información a procesar.


 Sub CuadroTexto1()
 Dim oDialogo As Object
 Dim oControl As Object
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("MiDialogo") )
 
     'El cuadro de texto
     oControl = oDialogo.getControl("txtNombre")
     'Mostramos el cuadro de diálogo
     oDialogo.execute()
     'Al cerrar mostramos el contenido del control
     MsgBox oControl.Text
     oDialogo.dispose()    
 
 End Sub


Observa en el ejemplo que consultamos el valor del control, después de que se cierra el cuadro de diálogo, recuerda que esto puede ser correcto, siempre y cuando la información ya este validada, esto es muy importante. Este control comparte la mayoría de las propiedades vistas en los formularios, excepto la capacidad de mostrar texto enriquecido.


Cuadro de lista (ListBox)

Agrega un control de cuadro de lista y nómbralo lstPaises.


 Sub CuadroLista1()
 Dim oDialogo As Object
 Dim oControl As Object
 Dim mDatos()
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("MiDialogo") )
 
     mDatos() = Array("México","España","Argentina","Colombia","Panama")            
     'El cuadro de lista
     oControl = oDialogo.getControl("lstPaises")    
     'Agregamos elementos
     oControl.getModel.StringItemList = mDatos()
     oDialogo.execute()
     'Mostramos el elemento seleccionado
     MsgBox oControl.SelectedItem
     oDialogo.dispose()    
 
 End Sub


Todos los métodos vistos en el capitulo de formularios, con este control, aplican para su uso dentro de cuadros de diálogo.


Cuadro combinado (ComboBox)

Agrega un control de cuadro combinado y llámalo cboColor.


 Sub CuadroCombinado1()
 Dim oDialogo As Object
 Dim oControl As Object
 Dim mDatos()
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("MiDialogo") )
 
     mDatos() = Array("Gris","Rojo","Amarillo","Verde","Azul")            
     'El cuadro combinado
     oControl = oDialogo.getControl("cboColor")    
     'Agregamos elementos
     oControl.getModel.StringItemList = mDatos()
     oDialogo.execute()
     'Mostramos el elemento seleccionado
     MsgBox oControl.Text
     oDialogo.dispose()    
 
 End Sub


Puedes usar las mismas propiedades y métodos vistos en el capítulo de formularios, recordando que este control comparte la mayoría de estas con el control cuadro de lista.


Barra de desplazamiento (ScrollBar)

Agrega un control de barra de desplazamiento y llámalo sbMover.


 Sub BarraDesplazamiento1()
 Dim oDialogo As Object
 Dim oControl As Object
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("MiDialogo") )
 
     'La barra de desplazamiento
     oControl = oDialogo.getControl("sbMover")    
     oDialogo.execute()
 
     'Mostramos el valor seleccionado
     MsgBox oControl.Value
     oDialogo.dispose()    
 
 End Sub


En la barra de herramientas de controles, veras dos controles de este tipo, uno horizontal y otro vertical, en realidad es el mismo control, solo que su propiedad de orientación (Orientation) esta establecida en uno y otro valor, si cambias esta propiedad, debes de intercambiar, también, los valores de ancho y alto del control, esto es por que no se redimensiona automáticamente.


 Sub BarraDesplazamiento2()
 Dim oDialogo As Object
 Dim oControl As Object
 Dim Ancho As Long
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("MiDialogo") )
 
     'La barra de desplazamiento
     oControl = oDialogo.getControl("sbMover")
     'Cambiamos la horientacion a vertical
     oControl.Orientation = 1
     'Guardamos el ancho
     Ancho = oControl.getModel.Width
     'Asignamos el nuevo ancho
     oControl.getModel.Width = oControl.getModel.Height
     'Establecemos el nuevo alto
     oControl.getModel.Height = Ancho
 
     oDialogo.execute()
     'Mostramos el valor seleccionado
     MsgBox oControl.Value
     oDialogo.dispose()    
 
 End Sub


Las demás propiedades, son las mismas vistas en los formularios.


Barra de progreso (ProgressBar)

Agrega un control barra de progreso en nuestro cuadro de diálogo y llámalo pbAvance. Este control no esta presente en los formularios, por lo que veremos sus principales propiedades aquí.


 Sub BarraProgreso1()
 Dim oDialogo As Object
 Dim oControl As Object
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("MiDialogo") )
 
     'La barra de desplazamiento
     oControl = oDialogo.getControl("pbAvance")
 
     With oControl.getModel()
         .BackgroundColor = RGB(Rnd*255,Rnd*255,Rnd*255)    'Color de fondo
         .FillColor = RGB(Rnd*255,Rnd*255,Rnd*255)        'Color de relleno
         .ProgressValueMax = 100                    'Valor máximo
         .ProgressValueMin = 1                        'Valor mínimo
     End With
     oDialogo.execute()    
     oDialogo.dispose()    
 
 End Sub


Este control esta pensado para mostrar el avance (progreso) de una tarea al usuario, por ejemplo, las líneas importadas de un archivo, la exportación de información o cualquier otro proceso que tenga un inicio y un fin, es decir, que generalmente sepamos cuando empieza y cuando termina para poder mostrar el avance como en el siguiente ejemplo.


 Sub BarraProgreso2()
 Dim oDialogo As Object
 Dim oControl As Object
 Dim co1 As Integer
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("MiDialogo") )
 
     'La barra de desplazamiento
     oControl = oDialogo.getControl("pbAvance")
 
     With oControl.getModel()
         For co1 = .ProgressValueMin To .ProgressValueMax
             'Asignamos el valor a la barra de progreso
             .ProgressValue = co1
             'Esperamos 10 milisegundos
             Wait 10
         Next co1
     End With
     oDialogo.execute()    
     oDialogo.dispose()    
 
 End Sub


Antes de que te enojes conmigo con justa razón, te explico, aparentemente, no veras ningún efecto, salvo, si eres observador, que al mostrar el cuadro de diálogo, la barra de progreso se mostrará llena, solo quise mostrarte el uso común en un rutina para la barra de progreso, generalmente, los valores máximos y mínimos se ajustan en tiempo de ejecución para adaptarse al proceso que estamos procesando, y el valor actual de la barra (ProgressValue), es el que va cambiando con el tiempo, en el siguiente capitulo veremos más ejemplos de este control en usos más cotidianos. También, es frecuente que este control se muestre al usuario, solo, mientras muestra el avance, después, se oculta, claro, esto, es a tu gusto y criterio, aunque, como buen programador, antes del gusto, satisface las necesidades del usuario.


Línea (FixedLine)

Este control es solo cosmético, cierto, le puedes asignar macros a los eventos que soporta, pero no es usual, generalmente solo se agrega para separar controles o secciones dentro del cuadro de diálogo, agrega un control de línea y llámala linSepara. Este control tiene pocas propiedades.


 Sub Linea1()
 Dim oDialogo As Object
 Dim oControl As Object
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("MiDialogo") )
 
     'La línea
     oControl = oDialogo.getControl("linSepara")    
     With oControl.getModel()
         .Orientation = 0                            'Orientación horizontal = 0
         .Label = "Opciones"                        'Solo en líneas horizontales
         .BackgroundColor = RGB(Rnd*255,Rnd*255,Rnd*255)    'Color de fondo
         .TextColor = RGB(Rnd*255,Rnd*255,Rnd*255)        'Color de texto
     End With
     oDialogo.execute()    
     oDialogo.dispose()    
 
 End Sub


Al igual que con las barras de desplazamiento, las líneas horizontales y verticales son el mismo control, solo cambia la propiedad orientación (Orientation), si cambias la orientación de la línea a vertical (), el texto (Label) no se mostrará y tienes que intercambiar el ancho por alto para mantener la proporción del control.


 Sub Linea2()
 Dim oDialogo As Object
 Dim oControl As Object
 Dim Ancho As Long
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("MiDialogo") )
 
     'La línea
     oControl = oDialogo.getControl("linSepara")
     'Cambiamos la horientacion a vertical
     oControl.getModel.Orientation = 1
     'Guardamos el ancho
     Ancho = oControl.getModel.Width
     'Asignamos el nuevo ancho
     oControl.getModel.Width = oControl.getModel.Height
     'Establecemos el nuevo alto
     oControl.getModel.Height = Ancho
     oDialogo.execute()
     oDialogo.dispose()    
 
 End Sub


Al contar con texto para mostrar al usuario, este control cuenta con todas las propiedades propias de los controles con texto (fuente, tamaño, color, estilo, etc), por lo que puedes establecerlas también.


Control de archivo (Filecontrol)

Este control nos permite seleccionar la ruta y nombre de cualquier archivo, solo nos devolverá la ruta seleccionada por el usuario, teniendo que agregar cualquier código necesario para manipular dicho archivo. Agrega un control de archivo y llámalo fcArchivo


 Sub ControlArchivo1()
 Dim oDialogo As Object
 Dim oControl As Object
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("MiDialogo") )
 
     'El control de archivo
     oControl = oDialogo.getControl("fcArchivo")    
     With oControl.getModel()
         .BackgroundColor = RGB(Rnd*255,Rnd*255,Rnd*255)    'Color de fondo
         .TextColor = RGB(Rnd*255,Rnd*255,Rnd*255)        'Color del texto
         .FontName = "Liberation Sans"                'Nombre de la fuente
         .FontHeight = 14                            'Tamaño de la fuente
         .Text = "/home/mau/Desktop"                    'Ruta predeterminada
     End With
     oDialogo.execute()        
     oDialogo.dispose()    
 
 End Sub


La ruta que establezcas en la propiedad texto (Text), será la ruta donde se abrirá el cuadro de diálogo de selección de archivo cuando el usuario presionar el botón Examinar... de este control, esta misma propiedad te sirve para recuperar la ruta de archivo seleccionado por el usuario, no obstante, siempre valida que el archivo exista.


Control de árbol (TreeControl)

Este control solo esta presente en los cuadros de diálogo, sirve para mostrar elementos jerarquizados, con la posibilidad de expandirse y contraerse. Agrega un nuevo control de árbol y llámalo tcDirectorios. Sus principales propiedades son.


 Sub ControlArbol1()
 Dim oDialogo As Object
 Dim oControl As Object
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("MiDialogo") )
 
     'El control de árbol
     oControl = oDialogo.getControl("tcDirectorios")    
     With oControl.getModel()
         .BackgroundColor = RGB(Rnd*255,Rnd*255,Rnd*255)    'Color de fondo
         .RootDisplayed = True                        'Si mostramos la raíz
         .Border = 2                                'Tipo de borde 2 = plano
         .Height = 170                            'Alto
         .Width = 125                            'Ancho
         .PositionX = 10                            'Posición X (desde izquierda)
         .PositionY = 120                            'Posición Y (desde arriba)
         .Printable = True                            'Si se imprime el control
         .SelectionType = 1                        'Tipo de selección
     End With
     oDialogo.execute()        
     oDialogo.dispose()    
 
 End Sub


El tipo de selección (SelectionType), determinará la forma de selección con el ratón o teclado, sus valores son: ninguno (0), sencillo (1), solo se selecciona un elemento, múltiple (2), se pueden seleccionar varios elementos, incluso alternados con apoyo de la tecla CTRL y rango (3) donde podemos arrastrar y seleccionar varios elementos.


Para agregar datos a este control, es necesario apoyarnos en otro servicio.


 Sub ControlArbol2()
 Dim oDialogo As Object
 Dim oControl As Object
 Dim oTDM As Object
 Dim oRaiz As Object
 Dim oPadre As Object
 Dim oHijo As Object
 Dim co1 As Integer
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("MiDialogo") )
 
     'El control de árbol
     oControl = oDialogo.getControl("tcDirectorios")    
     'Servicio para controlar el contenido del control
     oTDM = createUnoService("com.sun.star.awt.tree.MutableTreeDataModel")
     'Creamos el nodo raíz
     oRaiz = oTDM.createNode( "Raíz", True )
     'Establecemos el nodo raíz
     oTDM.setRoot( oRaiz ) 
 
     For co1 = 1 To 5
         'Creamos un nodo padre
         oPadre = oTDM.createNode( "Padre " & co1, True )
         'Lo asignamos a la raíz
         oRaiz.appendChild(oPadre) 
         'Creamos un nodo hijo
         oHijo = oTDM.createNode("Hijo " & co1, True )
         'Lo asignamos al nodo padre
         oPadre.appendChild( oHijo )
     Next co1
 
     'Asginamos los datos al modelo del control        
     oControl.getModel.DataModel = oTDM    
     'Altura de la fila de datos
     oControl.getModel.RowHeight = 25
     'Mostramos el cuadro de diálogo
     oDialogo.execute()
     'Mostramos el nodo seleccionado
     MsgBox oControl.getSelection.getDisplayValue
 
     oDialogo.dispose()    
 
 End Sub


Al cerrar el cuadro de diálogo, te tiene que mostrar el nodo seleccionado, si no hay ningún nodo seleccionado, te dará un error, para evitarlo, primero consulta el número de selecciones que hay.


    If oControl.getSelectionCount > 0 Then
        'Mostramos el nodo seleccionado
        MsgBox oControl.getSelection.getDisplayValue
    End If


En siguiente ejemplo, a partir de la ruta especificada, buscaremos todos los directorios contenidos y los agregaremos como nodos.


 Sub ControlArbol3()
 Dim oDialogo As Object
 Dim oControl As Object
 Dim oTDM As Object
 Dim oRaiz As Object
 Dim oPadre As Object
 Dim sRuta As String
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("MiDialogo") )
 
     oControl = oDialogo.getControl("tcDirectorios")    
     'Servicio para controlar el contenido del control
     oTDM = createUnoService("com.sun.star.awt.tree.MutableTreeDataModel")
 
     'La ruta para devolver directorios
     sRuta = "/home/mau/"
     If Dir(sRuta) <> "" Then
         'Creamos el nodo raíz
         oRaiz = oTDM.createNode( sRuta, True )
         'Establecemos el nodo raíz
         oTDM.setRoot( oRaiz )
         'Buscamos el primer directorio (16)
         sRuta = Dir(sRuta,16)
         'Cuando no haya más directorios sRuta estará vacía
         Do While sRuta <> ""
             Select Case Left(sRuta,1)
                 'Nos saltamos los ocultos
                 Case ".", ".."
                 Case Else
                     oPadre = oTDM.createNode( sRuta, True )
                     oRaiz.appendChild(oPadre)
             End Select
             'Siguiente directorio
             sRuta = Dir
         Loop
         oControl.getModel.DataModel = oTDM    
     End If
     oDialogo.execute()
 
     If oControl.getSelectionCount > 0 Then
         'Mostramos el nodo seleccionado
         MsgBox oControl.getSelection.getDisplayValue
     End If        
     oDialogo.dispose()    
 
 End Sub


Por supuesto, puedes hacer que se muestren tantos subdirectorios como quieras, en el siguiente capítulo resolveremos esta cuestión, pero puedes ir tratando de encontrar el ¿como?. A los nodos, también es posible agregarles una imagen, como en el siguiente ejemplo.


 Sub ControlArbol4()
 Dim oDialogo As Object
 Dim oControl As Object
 Dim oTDM As Object
 Dim oRaiz As Object
 Dim oPadre As Object
 Dim oHijo As Object
 Dim co1 As Integer
 Dim mRutas(1) As String
 
     DialogLibraries.LoadLibrary( "Standard" )
     oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("MiDialogo") )
 
     oControl = oDialogo.getControl("tcDirectorios")    
     oTDM = createUnoService("com.sun.star.awt.tree.MutableTreeDataModel")
     oRaiz = oTDM.createNode( "Raíz", True )
     oTDM.setRoot( oRaiz ) 
     'Matriz con las rutas de las imagenes de ejemplo
     mRutas(0) = ConvertToUrl("/home/mau/bien.jpg")
     mRutas(1) = ConvertToUrl("/home/mau/mal.jpg")
     For co1 = 1 To 2
         oPadre = oTDM.createNode( "Padre " & co1, True )
         oRaiz.appendChild(oPadre) 
         oHijo = oTDM.createNode("Hijo " & co1, True )
         'Asignamos la ruta de la imagen
         oHijo.setNodeGraphicURL( mRutas(co1-1) )
         oPadre.appendChild( oHijo )
     Next co1
 
     oControl.getModel.DataModel = oTDM    
     oControl.getModel.RowHeight = 25
     oDialogo.execute()
 
     If oControl.getSelectionCount > 0 Then
         MsgBox oControl.getSelection.getDisplayValue
     End If
 
     oDialogo.dispose()    
 
 End Sub


Este control cuenta con varios métodos más que nos permiten controlarlo completamente, pero estos métodos, los aprenderemos en el siguiente capítulo, donde aplicaremos todos los conocimientos vistos a los largo de este libro.


Otros controles

Todos los siguientes controles, son muy similares, son cuadros de texto, con alguna característica especial para algún tipo de dato, sus propiedades son las mismas vistas en el capítulo de formularios, y la forma de acceder a ellos, es por su nombre, igual que con cualquier otro control dentro del cuadro de diálogo, como lo hemos venido practicando en este tema.


Estos controles son:


  • Campo de fecha (DateField)
  • Campo de hora (TimeField)
  • Campo numérico (NumericField)
  • Campo de moneda (CurrencyField)
  • Campo formateado (FormattedFiel)
  • Campo enmascarado (PatternField)


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