Oprettelse af Hændelses-Aflyttere

Hændelser, der er iværksat af dialoger, dokumenter, formularer eller grafiske kontrolelementer kan linkes til makroer, hvilket kaldes hændelsesdrevet programmering. De mest almindelige måder at henvise hændelser til makroer er fanebladet Hændelser på menuen Funktioner -- Tilpas... og Dialogredigeringens kontrolpanel for egenskaber, som du finder under menuen Funktioner -- Makroer -- Administrer dialoger....

Grafiske artefakter, tastatur-input, musebevægelser og andre menneske/maskine-interaktioner kan kontrolleres med UNO-modtagere, der holder øje med brugerens adfærd. Modtagere er dynamisk programkodes alternativer til makro-opgaver. Man kan oprette så mange UNO-modtagere som der er hændelser at holde øje med. En enkelt modtager kan også håndtere flere brugerflade-kontroller.

Oprettelse af en hændelses-listener(/overvåger)

Listeners bliver knyttet til kontrol i dialoger, så vel som til dokument- eller formular-hændelser. Listeners bruges også under oprettelse af kørselstidsdialog eller når en dialog i farten skal have kontrolelementer.

Dette eksempel opretter en listener til Button1s kontrol af dialogen Dialog1 i biblioteket Standard.

Med 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"
         _MY_LABEL = 'Python lytter...'
         _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("Brugeren har set og forstået beskeden.")
             elif rc == CANCEL:
                 MsgBox("Brugeren afviste beskeden.")
             ui.dispose()  # ui.endExecute
             ctl.removeActionListener(act)
             
         def createUnoDialog(libr_dlg: str, embedded=False):
             """ Opret en besked fra dens placering """
             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):
             """ Lyt efter og tal antallet af klik på knapper """
             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):  # obligatorisk rutine
                 pass
             
         def MsgBox(txt: str):
             mb = util.MsgBox(uno.getComponentContext())
             mb.addButton("Ok")
             mb.show(txt, 0, "Python")
             
         g_exportedScripts = (Main,)
      

msgbox.py i {installation}/program/-kataloget har nogle eksempler på knap-listeners.

Med LibreOffice Basic


         Option Explicit
             
         Const MY_LIBRARY = "Standard", MY_DIALOG = "Dialog1", MY_BUTTON = "Button1"
         Const MY_LABEL = "Basic lytter..."
         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
                 Case rc.OK : MsgBox "Brugeren har set og forstået beskeden.",, "Basic"
                 Case rc.CANCEL : MsgBox "Brugeren har afvist beskeden.",, "Basic"
             End Select
             ui.dispose ' ui.endExecute()
             ctl.removeActionListener(act)
         End Sub
             
         Private Sub awt_actionPerformed(evt As com.sun.star.awt.ActionEvent)
             ''' Lyt efter og tæl antallet af klik på knapper '''
             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
             ' din kode skrives her
         End Sub ' awt_disposing
      

Andre Hændelses-overvågere

Listeners kodes normalt sammen med åbning af en dialog. Talrige tilgange til Listeners er mulige som for eksempel hændelses-håndteringer til dialoger eller hændelsesovervågere til dokumenter eller formularer.

Støt os venligst!