Acceso a los controles de los diálogos
Un diálogo puede contener cualquier número de elementos de control (en adelante, controles). Podemos acceder a los controles mediante su nombre y con el método getControl':
Function Control( oDlg As Object, cNombre As String ) As Object '-------------------------------------------------------------------------- On Local Error GoTo Error_Control Control = oDlg.getControl( cNombre ) Exit Function Error_Control: MsgBox "El control " & cNombre & " no existe o error en el diálogo" & Chr(13) & Error, 144, "Error" End Function
Veamos un ejemplo de como modificar la propiedad Text del control de tipo Label llamado Label1 de nuestro diálogo mediante este método:
Sub Main() '-------------------------------------------------------------------------- Dim oDlg As Object, nBoton As Integer Dim oCtrl As Object oDlg = DlgCrear( "Standard", "Dialog1" ) oCtrl = Control( oDlg, "Label1" ) oCtrl.Text = "Selecciona uno de la lista" nBoton = oDlg.Execute() If nBoton = 1 Then MsgBox ("Se ha pulsado el botón Aceptar", 192, "Información") Else MsgBox ("Se ha pulsado el botón Cancelar", 192, "Información") EndIf DlgCerrar oDlg End Sub
Este es el resultado:
Los nombres de los controles son sensibles al uso de mayúsculas / minúsculas
Si el control se llama Label1 no puede utilizarse el nombre label1 para identificarlo |
Trabajando con el contenido (Model) de los diálogos y controles
Es frecuente en la API 1 de Apache OpenOffice encontrarse con que los elementos visibles del programa (View) y los datos o documentos que hay detrás de ellos (Model) se separan en estos dos objetos para el acceso a sus propiedades.
En consecuencia, tanto el diálogo como los controles además de sus métodos y de sus propiedades inherentes, disponen de la propiedad Model que es en realidad un objeto subordinado, y que permite el acceso directo al contenido de un diálogo o de sus controles.
En los diálogos la distinción entre los datos (Model) y su representación (View) no siempre está tan clara como en otras áreas de la API.
Los elementos de la API están disponibles a través de ambas propiedades.
Cada tipo de control presentará unas propiedades y métodos distintos a través de su propiedad Model.
La siguiente función permite acceder a la capa Model de un control por su nombre:
Function Model( oDlg As Object, cNombre As String ) As Object '-------------------------------------------------------------------------- On Local Error GoTo Error_Model Model = oDlg.getControl( cNombre ).Model Exit Function Error_Model: MsgBox "El control " & cNombre & " no existe o error en el diálogo" & Chr(13) & Error, 144, "Error" End Function
El siguiente ejemplo muestra como configurar los datos de un objeto ListBox llamado ListaOrg presente en nuestro formulario a través de la propiedad Model:
Sub Main() '-------------------------------------------------------------------------- Dim oDlg As Object, nBoton As Integer Dim oCtrl As Object, oModel As Object oDlg = DlgCrear( "Standard", "Dialog1" ) oCtrl = Control( oDlg, "Label1" ) oCtrl.Text = "Selecciona uno de la lista" oModel = Model( oDlg, "ListaOrg" ) With oModel .StringItemList = Array( "Opción A", "Opción B", "Opción C", "Opción D", "Opción E" ) .FontHeight = 14 .BackgroundColor=RGB(255,255,195) .HelpText = "Selecciona un elemento de la lista para guardarlo" .SelectedItems = Array(3) End With nBoton = oDlg.Execute() If nBoton = 1 Then MsgBox ("Se ha pulsado el botón Aceptar", 192, "Información") Else MsgBox ("Se ha pulsado el botón Cancelar", 192, "Información") EndIf DlgCerrar oDlg End Sub
A través de la propiedad Model podemos acceder a las propiedades StringItemList, FontHeight, BackgroundColor, HelpText y SelectedItems que nos permiten configurar tanto los datos contenidos como el aspecto del control ListaOrg.
Este es el aspecto que muestra el diálogo al ejecutar el código:
Algunas de las propiedades a las que se puede acceder a través del objeto Model son:
Propiedad | Tipo | Descripción |
---|---|---|
Name |
String | Nombre del control |
Title |
String | Título de la ventana diálogo (esta propiedad sólo se aplica a los diálogos) |
Height |
Long | Alto del control (en unidades ma) |
Width |
Long | Ancho del control (en unidades ma) |
PositionX |
Long | Posición en el eje de las X del control, medida desde el borde interior izquierdo del diálogo (en unidades ma) |
PositionY |
Long | Posición en el eje de las Y del control, medida desde el borde interior superior del diálogo (en unidades ma) |
Para asegurarse de que los cuadros de diálogo se mostrarán igual independientemente de la plataforma en la que se ejecuten (Windows, Linux, MacOs, etc.) Apache OpenOffice utiliza las unidades ma 2 o Map AppFont como unidades internas a la hora de especificar la posición y el tamaño tanto de diálogos como de controles.
Una unidad ma se define como un octavo de la altura media de un carácter de la fuente de sistema definida para el sistema operativo, y una cuarta parte de su anchura.
Si deseas cambiar el tamaño o la posición de los controles en tiempo de ejecución, determina el tamaño total del diálogo y ajusta los valores de los controles en sus proporciones correspondientes.
Foco y orden de tabulación
Pulsando la tecla Tab se puede navegar por los controles de un diálogo; en este contexto, disponemos de las siguientes propiedades a través del objeto Model:
En el siguiente ejemplo, a nuestro diálogo le hemos añadido un control CheckBox; en el código, establecemos el título que muestra el diálogo, el control ListaOrg pasa a ser el elemento 0 en el orden de tabulación, y el control ChkDobleCopia se desactiva y se elimina del orden de tabulación:
Propiedad | Tipo | Descripción |
---|---|---|
Enabled |
Boolean | Activa (True) o desactiva (False) el control. Si el control está desactivado no puede tomar el foco y por lo tanto el usuario no puede editarlo. |
Tabstop |
Boolean | Activa (True) o desactiva (False) el salto al control mediante la tecla Tab. Si se desactiva, al pulsar la tecla Tab el control nunca toma el foco, por lo que el usuario sólo puede editarlo haciendo clic sobre el mismo. |
TabIndex |
Long | Posición del control en el orden de activación mediante la tecla Tab. |
getFocus |
El control recibe el foco (sólo para diálogos) |
En el siguiente ejemplo, a nuestro diálogo le hemos añadido un control CheckBox; en el código, establecemos el título que muestra el diálogo, el control ListaOrg pasa a ser el elemento 0 en el orden de tabulación, y el control ChkDobleCopia se desactiva y se elimina del orden de tabulación:
Sub Main() '-------------------------------------------------------------------------- Dim oDlg As Object, nBoton As Integer Dim oCtrl As Object, oModel As Object oDlg = DlgCrear( "Standard", "Dialog1" ) oDlg.Model.Title = "Copias de seguridad de clientes" oCtrl = Control( oDlg, "Label1" ) oCtrl.Text = "Selecciona uno de la lista" oModel = Model( oDlg, "ListaOrg" ) With oModel .StringItemList = Array( "Opción A", "Opción B", "Opción C", "Opción D", "Opción E" ) .FontHeight = 14 .BackgroundColor=RGB(255,255,195) .HelpText = "Selecciona un elemento de la lista para guardarlo" .SelectedItems = Array(3) .TabIndex(0) End With oModel = Model( oDlg, "ChkDobleCopia" ) oModel.TabStop = False oModel.Enabled = False nBoton = oDlg.Execute() If nBoton = 1 Then MsgBox ("Se ha pulsado el botón Aceptar", 192, "Información") Else MsgBox ("Se ha pulsado el botón Cancelar", 192, "Información") EndIf DlgCerrar oDlg End Sub
El resultado al ejecutar el código es el siguiente: