Python Listeners : Oprettelse af Hændelses-Aflyttere

Indhold

# Oprettelse af Hændelses-Aflyttere

Hændelser, der er iværksat af dialoger, dokumenter, formularer eller grafiske kontrolelementer kan kædes 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 ▸ Administrér 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 dialoger på afviklingstidspunktet, eller når en dialog skal have tilføjet kontrolelementer undervejs.

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.

Relaterede emner

Programmeringseksempler for kontrolelementer i dialogeditoren

CreateUnoListener-funktion

hændelseskortlægning til objekter

Se ogsåDokumenthændelser og Formularhændelser

Oprette en dialoghåndtering

Lytning til dokumenthændelser

Python programmeringseksempler