Turinys
Rodyklė 🔎︎

# Dialogo tvarkytuvo sukūrimas

Šalia makrokomandų priskyrimas įvykiams arba kuriant įvykių klausytojus, galima naudoti dialogo langų tvarkykles, kurių principas yra nustatyti UNO raktinius žodžius ar metodus, kurie yra susieti su stebimais įvykiais. Įvykių tvarkytojas yra atsakingas už metodų vykdymą naudojant vnd.sun.star.UNO:<method_name> protokolą. Skirtingai nuo dalyvių, kuriems reikia apibrėžti visus palaikomus metodus, net jei jie ir nenaudojami, dialogo tvarkyklėms reikia tik dviejų metodų virš esamų valdymo skriptų.

Šio požiūrio pranašumai yra šie:

- Jis supakuoja kodą įvykių valdomoms makrokomandoms tvarkyti,

- jis dekoreliuoja įvykius iš makrokomandų pavadinimų, o tai palengvina priežiūrą ar atnaujinimus, ypač perkeliant makrokomandas ar modulius.

Šis mechanizmas yra iliustruojamas „Basic“ ir „Python“ kalboms naudojant importuotą dialogo Access2Base dlgTrace kopiją. Aiškumo sumetimais išimčių tvarkymas ir lokalizavimas praleidžiami.

## Dialogo metodų priskyrimas

Exportuoti Access2Base dlgTrace dialogą ir importuoti jį į MyLib taikomąją biblioteką.

Dialogo tvarkytuvės valdymo savybių srityje naudokite skirtuką „Įvykiai“, kad pakeistumėte makrokomandas komponentų priskyrimais, ir numatytuose metoduose įveskite pavadinimus:

- Nustatykite Persiųsti į failą dialogo mygtuko komponento metodo vardą _dump2File

- Pasirinktinai apibrėžkite txtTracelog paspausto mygtuko ir paspausto pelės klavišo įvykių komponentų metodų vardus _openHelp

- Pasirinktinai apibrėžkite Gerai mygtuko, gaunančio židinio įvykio komponento metodą, pavadinimą onOkHasfocus

Įvykiuose, kuriems priskirti veiksmai, turėtų būti paminėtas vnd.sun.star.UNO: protokolas.

## Tvarkyklės kūrimas

createDialogWithHandler metodo com.sun.star.awt.DialogProvider2 paslauga naudojama dialogui nustatyti ir jam tvarkyti. Tvarkytuvas valdo įgyvendinimo com.sun.star.awt.XDialogEventHandler sąsają.

Visi komponentų metodų pavadinimai turi būti išreikštai aprašyti naudojant dialogo tvarkytuvą.

### Naudojant „Python"

Šiame pavyzdyje dialogo langas yra kompiuteryje.

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

          import uno, unohelper
          from com.sun.star.awt import XDialogEventHandler

          _DLG_PROVIDER = "com.sun.star.awt.DialogProvider2"

          class Console(unohelper.Base, XDialogEventHandler):
              """ Access2Base konsolės tvarkytuvas """
              '''  « Créer un dialogue avec gestionnaire d'événements » adaptavo JM Zambon
              https://wiki.openoffice.org/wiki/FR/Documentation/Python/Creating_Dialog_with_Handler '''
              def show(self):
                  dialog = self.getDialog("MyLib.dlgTrace", embedded=True)
                  dialog.Title = "Konsole"
                  dialog.execute()

              def callHandlerMethod(self, dialog, event, method):
                  if method == '_dump2File':
                      event.Source.setLabel("dump requested")
                      scr = getBasicScript(script="_DumpToFile", module="Trace",
                          library='Access2Base')
                      scr.invoke((event,), (), ())
                  elif method == '_openHelp':
                      _msgbox('Not yet implemented')
                      dialog.endDialog(1)
                  else:
                      return False

              def getSupportedMethodNames(self):
                  return ('_dump2File', '_openHelp')

              def getDialog(self, libr_dlg: str, embedded=False):
                  """ Sukurti dialogą iš vietos """
                  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.createDialogWithHandler("vnd.sun.star.script:"+libr_dlg+location, self)
                  return dlg

          # def getBasicScript()  # see note

          def _msgbox(prompt='', title=''):
              ''' Negražus MsgBox '''
              import msgbox
              mb = msgbox.MsgBox(uno.getComponentContext())
              mb.addButton('Howdy')
              mb.show(prompt,0,title)

          def ConsoleHandler():
              Console().show()

          g_exportedScripts = (ConsoleHandler,)

Kaip ir tikėtasi, onOkHasFocus trūkstamas metodas sudaro išimtį.

Nurodoma į „Python“ kreipinių į „LibreOffice Basic“ tinklalapį, esantį getBasicScript paprogramės apraše ir teikiant išsamesnę informaciją apie skriptų vykdymą keliomis kalbomis.

### Naudojant „LibreOffice Basic“

Šiame pavyzdyje dialogo langas yra įterptas į dokumentą ir jį taip pat galima rasti kompiuteryje.

          ' <MyLib>.<Handler> module

          Public Sub Console_Show()
              Dim dp as Object ' com.sun.star.awt.DialogProvider2
              Dim dialog As Object ' com.sun.star.awt.XDialog, com.sun.star.awt.XDialogEventHandler
              Dim eventHandler As Object ' com.sun.star.awt.XDialogEventHandler
              dp = CreateUnoService("com.sun.star.awt.DialogProvider2")
              dp.Initialize(Array(ThisComponent)) ' if doc-embedded dialogas
              eventHandler = CreateUnoListener("Console_", "com.sun.star.awt.XDialogEventHandler")
              dialog = dp.createDialogWithHandler("vnd.sun.star.script:MyLib.dlgTrace?location=document", eventHandler)
              dialog.Title = "Konsole"
              dialog.execute()
          End Sub ' <Handler>.Console_Show()

          Private Function Console_callHandlerMethod(dialog as Object, _
                  event As com.sun.star.document.DocumentEvent, _
                  metodas kaip eilutė) loginis
              ''' Intercept dialog events using .UNO protocol '''
              Console_callHandlerMethod = True
              Select Case method
                  Case "_dump2File"
                      event.Source.setLabel("dump requested")
                      With GlobalScope.BasicLibraries
                          If Not .IsLibraryLoaded("Access2Base") Then .LoadLibrary("Access2Base")
                      End With
                      Access2Base.Trace._DumpToFile
                  Case "_openHelp"
                      MsgBox "Not yet implemented",0 , "Howdy"
                      'dialog.endDialog(1) if computer-based dialogas
                  Case Else : Console_callHandlerMethod = False
              End Select
          End Function ' <Handler>.Console_callHandlerMethod

          Private Function Console_getSupportedMethodNames()
              Console_getSupportedMethodNames = Array("_dump2File", "_openHelp")
          End Function ' <Handler>.Console _getSupportedMethodNames

          ' « Créer un dialogue avec gestionnaire d'événements » adaptavo JM Zambon
          ' https://wiki.openoffice.org/wiki/FR/Documentation/Python/Creating_Dialog_with_Handler

Kaip ir tikėtasi, onOkHasFocus trūkstamas metodas sudaro išimtį.

Susijusios temos

Kreipiamasi į Basic kalbos makrokomandas iš Python kalbos

Atveriamas dialogas naudojant „Basic“

CreateUnoListener funkcija

Įvykių dalyvių sukūrimas

Atveriamas Pitono dialogo langas

Listening to Document Events

Python programavimo pavyzdžiai

LibreOffice Python skriptai žinynas