Uso de cookies

Utilizamos cookies propias y de terceros para mejorar nuestros servicios y mostrarle publicidad relacionada con sus preferencias mediante el análisis de sus hábitos de navegación. Si continúa navegando, consideramos que acepta su uso. Para obtener más información o bien conocer cómo cambiar la configuración lea nuestra Política de cookies

Eventos de controles en OOo Basic


Tanto diálogos como formularios están orientados a eventos. Esto significa que podemos definir procedimientos que se ejecutan cuando se produce uno de estos eventos, a las que solemos denominar como manejadores de eventos.


Un manejador de evento ejecuta un procedimiento definido cuando se produce una acción en particular, como por ejemplo, escribir en un control campo de texto o hacer clic sobre un control botón.


También se pueden editar documentos, o acceder a bases de datos mediante este sistema, así como modificar los propios controles del diálogo y/o formulario.


Los controles reconocen diferentes tipos de eventos que se activan cuando el usuario de la aplicación realiza determinadas acciones. Se pueden dividir en cuatro grupos:


Grupo de eventos Descripción

Eventos del ratón o dispositivo apuntador

Se corresponden con las acciones realizadas con un ratón o dispositivo apuntador, como hacer un clic o mover el puntero sobre un lugar determinado.

Eventos del teclado

Se corresponden con las acciones realizadas desde un teclado, como por ejemplo pulsar una tecla, o soltarla.

Cambio del foco

Se corresponden con la navegación que el usuario realiza sobre los controles. Por ejemplo, al hacer clic sobre un control o pulsar la tecla Tab (el control actual pierde el foco, el nuevo control coge el foco).

Otros eventos específicos

Son específicos para cada tipo de control, y dependen de sus propiedades.


En el apartado anterior ya asignamos a los botones BtCopiar y BtRestaurar las subrutinas que actúan como manejadores de los eventos Botón del ratón soltado.


En este apartado mostraremos un ejemplo que nos permite cambiar el color de fondo de un control cuando toma o pierde el foco.


Sub FocoCoger( oEv )
'--------------------------------------------------------------------------
   Dim oCtrl As Object
   On Local Error GoTo Error_FocoCoger
   oCtrl = oEv.Source
   ' Almacenamos su color actual en su propiedad Tag para recuperarla luego
   oCtrl.Model.Tag = oCtrl.Model.BackgroundColor
   oCtrl.Model.BackgroundColor = RGB(255,220,220)
Error_FocoCoger:
End Sub


Sub FocoPerder( oEv )
'--------------------------------------------------------------------------
   Dim oCtrl As Object
   On Local Error GoTo Error_FocoPerder
   oCtrl = oEv.Source
   ' Recuperamos el color original almacenado en su propiedad Tag
   oCtrl.Model.BackgroundColor = oCtrl.Model.Tag
Error_FocoPerder:
End Sub


En ambas rutinas hemos establecido un control de errores que parece no hacer nada, pero que en caso de que exista un error nos permite escapar del bucle infinito que se establecería al ir cogiendo y perdiendo el control el foco tras presentarse los mensajes de error.


La rutina FocoCoger la hemos asignado al evento Recepción de foco de los controles ListOrg y ListDst, de forma que al hacer clic sobre ellos o activarlos mediante la tecla Tab cambien de color de fondo.


La rutina FocoPerder la hemos asignado al evento Al perder el foco de los mismos controles, de forma que al hacer clic sobre otro control o desactivarlos mediante la tecla Tab recuperen el color de fondo original.


Dialogos-basic-macro-openoffice-009.png
Al coger el foco, el control cambia de color de fondo


En el código utilizamos la propiedad Tag para almacenar el color actual del color de fondo del control. Todos los controles disponen de la propiedad Tag, que es una variable de tipo cadena donde los programadores podemos almacenar cualquier información que deseemos asociar al control.


El entorno de desarrollo de Apache OpenOffice Basic

En imágenes anteriores hemos visto el entorno de desarrollo de Apache OpenOffice Basic; en el último diálogo mostrado se ven dos controles de tipo ListBox con unos botones que permiten pasar elementos de una lista a la otra.


Para que los controles hagan su tarea es necesario implementar los procedimientos asociados a sus eventos. Cuando los proyectos crecen, el número de funciones y subrutinas necesarias lo hacen también.


Aunque estos procedimientos pueden estar en cualquier módulo de la librería, y la librerías pueden contener muchos módulos, por mera cuestión organizativa y para facilitar el mantenimiento, lectura y revisión del código, consideramos recomendable utilizar un sólo módulo por cada diálogo que contenga el proyecto, y llamarlos de forma similar (el módulo mClientes y el diálogo dClientes, o Clientes y Clientes_Dlg, por ejemplo).


También en pro de facilitar la lectura del código es conveniente que los nombres de los procedimientos y de las variables sean lo suficientemente significativos, sin tampoco pecar de nombres largos en exceso.


Utilizar prefijos como o para objeto, n para numérico, f para fecha, h para hora, c para carácter suele ser muy útil para evitar errores de asignación en variables; también permite llamar de semejante modo al control y a la variable que creamos para manipularlo (por ejemplo, si el control se llama ListaClientes podemos llamar a la variable oListaClientes).


Los procedimientos asignados a eventos también serán más legibles si les asignamos nombres relacionados con el control (por ejemplo, ListaClientes_Clic, ListaClientes_Tecla, ListaClientes_CogeFoco, etc.)


Si los controladores de eventos son genéricos para varios controles, podemos hacer lo contrario: utilizar como nombre el del evento (por ejemplo FocoCoger_BtLstClientes para controlar el evento Recepción de foco de varios botones relacionados con una lista de clientes).


En el siguiente código que nos permite mover los elementos de una lista a la otra se muestran algunas de estas técnicas:


Sub BtLista_Clic( oEv )
'--------------------------------------------------------------------------
   Dim oDlg As Object, oCtrl As Object
   On Local Error GoTo Error_BtLista_Clic
 
   oDlg = oEv.Source.Context
   oCtrl = oEv.Source
 
   Select Case oCtrl.Model.Name
   Case "BtAgregaTodos"
      ListaMueveTodo oDlg.getControl("ListaOrg"), oDlg.getControl("ListaDst")
   Case "BtAgregaSel"
      ListaMueveSel oDlg.getControl("ListaOrg"), oDlg.getControl("ListaDst")
   Case "BtQuitaSel"
      ListaMueveSel oDlg.getControl("ListaDst"), oDlg.getControl("ListaOrg")
   Case "BtQuitaTodos"
      ListaMueveTodo oDlg.getControl("ListaDst"), oDlg.getControl("ListaOrg")
   End Select
 
Error_BtLista_Clic:
End Sub


Sub ListaMueveTodo( oLstOrg As Object, oLstDst As Object )
'--------------------------------------------------------------------------
   Dim n As Long
   For n = oLstOrg.ItemCount - 1 To 0 Step -1
      oLstDst.AddItem( oLstOrg.Items(n), -1 )
      oLstOrg.removeItems(n, 1)
   Next
End Sub


Sub ListaMueveSel( oLstOrg As Object, oLstDst As Object )
'--------------------------------------------------------------------------
   If oLstOrg.SelectedItem > 0 Then
      oLstDst.AddItem( oLstOrg.SelectedItem, -1 )
      oLstOrg.removeItems(oLstOrg.SelectedItemPos, 1)
   EndIf
End Sub


El diálogo Acción asignada

El diálogo Acción asignada enumera todos los eventos disponibles de un control.


Dialogos-basic-macro-openoffice-010.png
Diálogo Acción asignada de un control


Para asignar un procedimiento a un evento:

  • 1. Seleccionamos el control, y en el diálogo Propiedades seleccionamos la ficha Acontecimientos
  • 2. Hacemos clic sobre el botón con puntos suspensivos situado al final de la línea del evento seleccionado
  • 3. Seleccionamos el evento y hacemos clic sobre el botón Macro...
  • 4. Buscamos el procedimiento a asignar y lo seleccionamos. Clic en Aceptar, y de nuevo en Aceptar


Parámetros de los eventos

Que un evento ocurra no es a veces suficiente información para ofrecer una respuesta adecuada. Puede que necesitemos información adicional, como por ejemplo, el lugar exacto de la pantalla sobre el que el usuario hizo clic.


Cuando se produce un evento al procedimiento controlador se le pasa un objeto Evento, cuyos parámetros podemos utilizar para obtener esa información extra.


Sub ProcesoDelEvento( oEvento As Object )
 ' líneas para gestionar el evento
End Sub


La estructura y propiedades del objeto Evento son distintas según el tipo de evento que se ha desencadenado. Pero todos los eventos ofrecen acceso al control que lo ha provocado (mediante Evento.Source) y a su modelo (mediante Evento.Source.Model).


Estas propiedades se pueden utilizar también para desencadenar un evento desde dentro del propio controlador de eventos.


Señal CopyRight.png

Texto, imágenes y código bajo licencia CC BY-SA.png

Basado en el documento Getting Started with Base. Apache OpenOfficetm Database Component, de Drew Jensen Copyright 2013 liberado bajo licencia Apache Software License 2.0, que incluye material de:
  • OpenOffice.org 3.3 Getting Started Guide, Chapter 8 - Getting Started with Base, Copyright 2010 Dan Lewis, Iain Roberts, Magnus Adielsson, Jean Hollis Weber, JiHui Choi
  • OpenOffice.org 3.2 BASIC Guide · March 2010, Copyright Oracle Corp.
Modificada el 27 may 2015 04:28.   Visitas: 3441