Contingut

# Crea oients d'esdeveniments

Els esdeveniments emesos pels diàlegs, documents, formularis o controls, es poden enllaçar a macros, el que es coneix com a programació orientada a esdeveniments. El mètode més comú per a relacionar esdeveniments amb macros és la pestanya Esdeveniments Eines - Personalitza el menú i el panell de control de propietats de l'Editor de diàlegs des del menú Eines - Macros - Organitza els diàlegs... .

Artefactes gràfics, entrades de teclat, moviments del ratolí i altres interaccions home/màquina es poden controlar utilitzant oients UNO que vigilen el comportament de l'usuari. Els oients són alternatives de codi de programa dinàmic a les assignacions de macros. Un pot crear tants oients UNO com esdeveniments a vigilar hi haja. Un sol oient també pot gestionar múltiples controls de la interfície d'usuari.

## Crea un oient d'esdeveniments

Els oients s'adjunten als controls mantinguts en diàlegs, així com als esdeveniments de documentar o formularis. Els oients també s'utilitzen quan es creen diàlegs en temps d'execució o quan s'afigen controls a un diàleg al vol.

Aquest exemple crea un oient per al control Botó1 del diàleg Diàleg1 a la biblioteca Standard.

### Amb el Python

             # -*- coding: utf-8 -*-
             from __future__ import unicode_literals

             import uno, unohelper
             from com.sun.star.awt import XActionListener
             from com.sun.star.awt import ActionEvent
             from com.sun.star.lang import EventObject
             from com.sun.star.ui.dialogs.ExecutableDialogResults \
                 import OK, CANCEL
             import msgbox as util

             _MY_BUTTON =  "Button1"
             _MYLABEL = 'Oient Python'..'
             _DLG_PROVIDER = "com.sun.star.awt.DialogProvider"

             def Main(*args):
                 ui = createUnoDialog("Standard.Dialog1", embedded=True)
                 ui.Title = "Python X[any]Listener"
                 ctl = ui.getControl(_MY_BUTTON)
                 ctl.Model.Label = _MY_LABEL
                 act = ActionListener()
                 ctl.addActionListener(act)
                 rc = ui.execute()
                 if rc == OK:
                     MsgBox("L'usuari ha reconegut el diàleg.")
                 elif rc == CANCEL:
                     MsgBox("L'usuari ha cancel·lat el diàleg.")
                 ui.dispose()  # ui.endExecute
                 ctl.removeActionListener(act)

             def createUnoDialog(libr_dlg: str, embedded=False):
                 """ Crea un diàleg des de la seua ubicació """
                 smgr = XSCRIPTCONTEXT.getComponentContext().ServiceManager
                 if embedded:
                     model = XSCRIPTCONTEXT.getDocument()
                     dp = smgr.createInstanceWithArguments(_DLG_PROVIDER, (model,))
                     location = "?location=document"
                 else:
                     dp = smgr.createInstanceWithContext(_DLG_PROVIDER, ctx)
                     location = "?location=application"
                 dlg = dp.createDialog("vnd.sun.star.script:"+libr_dlg+location)
                 return dlg

             class ActionListener(unohelper.Base, XActionListener):
                 """ Listen to & count button clicks """
                 def __init__(self):
                     self.count = 0

                 def actionPerformed(self, evt: ActionEvent):
                     self.count = self.count + 1
                     #mri(evt)
                     if evt.Source.Model.Name == _MY_BUTTON:
                         evt.Source.Model.Label = _MY_LABEL+ str( self.count )
                 return

                 def disposing(self, evt: EventObject): # rutina obligatòria
                     pass

             def MsgBox(txt: str):
                 mb = util.MsgBox(uno.getComponentContext())
                 mb.addButton("Ok")
                 mb.show(txt, 0, "Python")

             g_exportedScripts = (Main,)

msgbox.py al directori {instal·lació}/programa/ hi ha alguns exemples d'oients de botons.

### Amb el LibreOffice Basic

             Option Explicit

             Const MY_LIBRARY = "Standard", MY_DIALOG = "Dialog1", MY_BUTTON = "Button1"
             Const MY_LABEL = "Oients bàsics."
             Dim count As Integer

             Sub Main
                 Dim libr As Object ' com.sun.star.script.XLibraryContainer
                 Dim dlg As Object
                 Dim ui As Object  ' stardiv.Toolkit.UnoDialogControl
                 Dim ctl As Object ' stardiv.Toolkit.UnoButtonControl
                 Dim act As Object ' com.sun.star.awt.XActionListener
                 Dim rc As Object : rc = com.sun.star.ui.dialogs.ExecutableDialogResults

                 BasicLibraries.LoadLibrary(MY_LIBRARY)
                 libr = DialogLibraries.GetByName(MY_LIBRARY)
                 dlg = libr.GetByName(MY_DIALOG)
                 ui = CreateUnoDialog(dlg)
                 ui.Title = "Basic X[any]Listener example"
                 count = 0
                 ctl = ui.GetControl(MY_BUTTON)
                 ctl.Model.Label = MY_LABEL
                 act = CreateUnoListener("awt_", "com.sun.star.awt.XActionListener")
                 ctl.addActionListener(act)
                 Select Case ui.Execute
                     Cas rc.OK: MsgBox "L'usuari ha reconegut el diàleg.",, "Basic"
                     Cas rc.CANCEL MsgBox "L'usuari ha cancel·lat el diàleg.",, "Basic"
                 End Select
                 ui.dispose ' ui.endExecute()
                 ctl.removeActionListener(act)
             End Sub

             Private Sub awt_actionPerformed(evt As com.sun.star.awt.ActionEvent)
                 ''' Listen to & count button clicks '''
                 With evt.Source.Model
                     If .Name = MY_BUTTON Then
                         count = count + 1
                         .Label = MY_LABEL+Cstr(count)
                     End If
                 End With
             End Sub ' awt_actionPerformed

             Private Sub awt_disposing(evt As com.sun.star.lang.EventObject) ' mandatory Sub
                 ' el vostre codi va ací
             End Sub ' awt_disposing

## Altres oients d'esdeveniments

Listeners are usually coded along with dialog opening. Numerous listener approaches are possible such as event handlers for dialogs or event monitors for documents or forms.

Temes relacionats

Exemples de programació dels controls de l'editor de diàlegs

CreateUnoListener Function

Events mapping to objects

See also Document events, Form events.

Crea un controlador de diàleg

Listening to Document Events

Exemples de programació en Python