Помощ за LibreOffice 24.8
Събитията, изпращани от диалози, документи, формуляри или графични контроли, могат да бъдат свързвани с макроси – това се нарича програмиране, базирано на събития. Най-разпространеният метод за обвързване на събитие с макрос са разделът Събития в менюто и панелът „Свойства на контрола“ в редактора на диалогови прозорци от менюто .
Графичните елементи, входът от клавиатурата, движенията на мишката и други взаимодействия човек – машина могат да се управляват чрез слушатели на UNO, които наблюдават действията на потребителя. Слушателите представляват алтернатива с динамичен програмен код на присвояването на макроси. Можете да създадете толкова слушатели на UNO, колкото събития са достъпни за наблюдение. Един слушател може да обработва няколко контроли от потребителския интерфейс.
Слушателите се прикрепват към контролите в диалогови прозорци, както и към събития от документи или формуляри. Слушатели се използват и при създаване на диалози или добавяне на контроли към диалогов прозорец по време на изпълнение.
Този пример създава слушател за контролата Button1 в диалога Dialog1 от библиотеката Standard.
# -*- 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 слуша...'
_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("Потребителят потвърди диалога.")
elif rc == CANCEL:
MsgBox("Потребителят отказа диалога.")
ui.dispose() # ui.endExecute
ctl.removeActionListener(act)
def createUnoDialog(libr_dlg: str, embedded=False):
""" Създаване на диалог от местоположението му """
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):
""" Наблюдаване и броене щракванията на бутони """
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): # задължителна подпрограма
pass
def MsgBox(txt: str):
mb = util.MsgBox(uno.getComponentContext())
mb.addButton("Ok")
mb.show(txt, 0, "Python")
g_exportedScripts = (Main,)
msgbox.py в директорията {инсталация}/program/ съдържа примери за слушатели на бутони.
Option Explicit
Const MY_LIBRARY = "Standard", MY_DIALOG = "Dialog1", MY_BUTTON = "Button1"
Const MY_LABEL = "Basic слуша..."
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 "Потребителят потвърди диалога.",, "Basic"
Case rc.CANCEL : MsgBox "Потребителят отказа диалога.",, "Basic"
End Select
ui.dispose ' ui.endExecute()
ctl.removeActionListener(act)
End Sub
Private Sub awt_actionPerformed(evt As com.sun.star.awt.ActionEvent)
''' Наблюдаване и броене щракванията на бутони '''
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
' място за вашия код
End Sub ' awt_disposing
Слушателите обикновено се програмират заедно с отварянето на диалога. Възможни са множество подходи, например обработчици на събития за диалози или наблюдатели на събития за документи или формуляри.