Python Listeners: Opprettar hendingslyttarar

Indhald
Innhaldsliste 🔎︎

# Oppretting av hendingslyttarar

Hendingar som er utløyste av dialogar, dokument, skjema eller grafiske kontrollar, kan koplast til makroar, som vert kalla hendingsdrive programmering. Den vanlegaste metoden for å relatere hendingar til makroar er fana Hendingar tab i menyen Verktøy → Tilpass og dialog-redigeringsprogram Kontroll-eigenskapar frå Verktøy → Makroar → Organiser makroar.

Grafiske framstillingar, tastaturunngangar, muserørsler og andre samhandlingar mellom menneske og maskin kan styrast ved hjelp av UNO-lyttarar som overvåker åtferda til brukaren. Lyttarar er dynamisk programkodealternativ til makrotildelingar. Du kan oppretta så mange UNO-lyttarar som du treng for å overvaka hendingar. Ein enkelt lyttar kan også handsama fleire brukargrensesnitt-kontrollar.

## Slik lagar du ein hendingslyttar

Lyttarane vert knytte til kontrollelement i dialogar og til dokument- eller skjemahendingar. Lyttarar vert også brukte når du lagar køyretidsdialogar eller kontrollelement i farta.

Dette eksempelet lagar ein lyttar til kontrollelementet Button1i dialogvindauget 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 lyttar …'
             _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("Brukaren har sett og forstått meldinga.")
                 elif rc == CANCEL:
                     MsgBox("Brukaren har avslått meldinga.")
                 ui.dispose()  # ui.endExecute
                 ctl.removeActionListener(act)

             def createUnoDialog(libr_dlg: str, embedded=False):
                 """ Lag eit dialofvindauge ut frå plasseringa av det """
                 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):
                 """ Lytt efter og tel kor mange klikk på knappar """
                 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/-katalogen har nokre eksempel på knapp-lyttarar.

### Med LibreOffice Basic

             Option Explicit

             Const MY_LIBRARY = "Standard", MY_DIALOG = "Dialog1", MY_BUTTON = "Button1"
             Const MY_LABEL = "Basic lyttar …"
             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 "Brukaren har sett og forstått meldinga.",, "Basic"
                     Case rc.CANCEL : MsgBox "Brukaren har avvist meldinga.",, "Basic"
                 End Select
                 ui.dispose ' ui.endExecute()
                 ctl.removeActionListener(act)
             End Sub

             Private Sub awt_actionPerformed(evt As com.sun.star.awt.ActionEvent)
                 """ Lytt efter og tel kor mange klikk på knappar """
                 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
                 ' her kjem koden din
             End Sub ' awt_disposing

## Andre hendings-lyttarar

Lyttarane vert normalt koda saman med dialogopning. Det er mogeleg med mange lyttarar samstundes, for eksempel hendingshandsamarar for dialogvindauge eller hendingsovervaking av dokument eller skjema.

Liknande emne

Programmeringseksempel for kontrollar i redigeringa av dialogvindauge.

CreateUnoListener-funksjonen

Hendingar som vert tilordna objekt

Sjå ogsåDokumenthendingar og Skjemahendingar

Overvåking av dokumenthendingar

Pythonprogrammering, eksempel