ເນື້ອໃນ

# ການສ້າງ Dialog Handler

ນອກຈາກ ການມອບໝາຍແມັກໂຄຣໃຫ້ກັບເຫດການ ຫຼື ການສ້າງຕົວຮັບຟັງເຫດການ ແລ້ວ, ເຮົາສາມາດໃຊ້ dialog handlers ເຊິ່ງມີຫຼັກການຄືການກຳນົດຄຳສຳຄັນ UNO ຫຼື ເມັດທອດ ທີ່ຖືກຈັບຄູ່ກັບເຫດການທີ່ຕ້ອງການຕິດຕາມ. ເຄື່ອງມືຈັດການເຫດການມີໜ້າທີ່ຮັບຜິດຊອບໃນການຣັນເມັດທອດໂດຍໃຊ້ໂປຣໂຕຄໍ vnd.sun.star.UNO:<method_name>. ບໍ່ຄືກັບ listeners ທີ່ຕ້ອງກຳນົດທຸກເມັດທອດທີ່ຮອງຮັບ, dialog handlers ຕ້ອງການພຽງແຕ່ສອງເມັດທອດເທົ່ານັ້ນ ເພີ່ມເຕີມຈາກສະຄຣິບຄວບຄຸມທີ່ຕັ້ງໃຈໄວ້.

ຂໍ້ດີຂອງວິທີການນີ້ຄື:

- ມັນລວມລະຫັດທີ່ຈັດການແມັກໂຄຣທີ່ຂັບເຄື່ອນດ້ວຍເຫດການໄວ້ຮ່ວມກັນ,

- ມັນແຍກເຫດການອອກຈາກຊື່ແມັກໂຄຣ ເຊິ່ງຊ່ວຍໃຫ້ການບຳລຸງຮັກສາ ຫຼື ການອັບເດດສະດວກຂຶ້ນ ໂດຍສະເພາະເມື່ອມີການຍ້າຍແມັກໂຄຣ ຫຼື ໂມດູນ.

ກົນໄກນີ້ແມ່ນສະແດງໄວ້ໃນນີ້ສຳລັບພາສາ Basic ແລະ Python ໂດຍໃຊ້ສຳເນົາໄດອາລັອກ dlgTrace ຂອງ Access2Base ທີ່ນຳເຂົ້າມາ. ການຈັດການຂໍ້ຜິດພາດ ແລະ ການປັບແຕ່ງຕາມພາສາແມ່ນໄດ້ຂ້າມໄປເພື່ອຄວາມຊັດເຈນ.

## ການມອບໝາຍເມັດທອດຂອງໄດອາລັອກ

ສົ່ງອອກໄດອາລັອກ dlgTrace ຂອງ Access2Base ແລະ ນຳເຂົ້າມາໃນໄລບຣາຣີແອັບພລິເຄຊັນ MyLib.

ພາຍໃນແຖບຄຸນສົມບັດຂອງຕົວຄວບຄຸມໃນ ຕົວແກ້ໄຂໄດອາລັອກ, ໃຫ້ໃຊ້ແຖບ ເຫດການ ເພື່ອປ່ຽນການມອບໝາຍແມັກໂຄຣເປັນການມອບໝາຍສ່ວນປະກອບ ແລະ ພິມຊື່ເມັດທອດທີ່ຕ້ອງການ:

- ຕັ້ງຊື່ເມັດທອດຂອງສ່ວນປະກອບປຸ່ມ Dump to file ເປັນ _dump2File

- ສາມາດກຳນົດຊື່ເມັດທອດສຳລັບເຫດການກົດປຸ່ມຄີບອດ ແລະ ປຸ່ມເມົາສ໌ຂອງ txtTracelog ເປັນ _openHelp

- ສາມາດກຳນົດຊື່ເມັດທອດສຳລັບເຫດການປຸ່ມ Ok ໄດ້ຮັບໂຟກັດເປັນ onOkHasfocus

ການກະທຳທີ່ມອບໝາຍໃຫ້ເຫດການຄວນລະບຸໂປຣໂຕຄໍ vnd.sun.star.UNO:.

## ການສ້າງຕົວຈັດການ (handler)

ເມັດທອດ createDialogWithHandler ຂອງບໍລິການ com.sun.star.awt.DialogProvider2 ແມ່ນໃຊ້ເພື່ອຕັ້ງຄ່າໄດອາລັອກ ແລະ ຕົວຈັດການຂອງມັນ. ຕົວຈັດການມີໜ້າທີ່ໃນການນຳໃຊ້ສ່ວນຕິດຕໍ່ com.sun.star.awt.XDialogEventHandler.

ຊື່ເມັດທອດຂອງສ່ວນປະກອບທັງໝົດຕ້ອງຖືກປະກາດຢ່າງຈະແຈ້ງເມື່ອໃຊ້ dialog handler.

### ດ້ວຍ Python

ໃນຕົວຢ່າງນີ້ ໄດອາລັອກແມ່ນຕັ້ງຢູ່ໃນຄອມພິວເຕີ.

          # -*- 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 """
              ''' ປັບປຸງມາຈາກ « Créer un dialogue avec gestionnaire d'événements » ໂດຍ 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):
                  """ ສ້າງໄດອາລັອກຈາກຕຳແໜ່ງທີ່ຕັ້ງຂອງມັນ """
                  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=''):
              ''' MsgBox ແບບພື້ນຖານ '''
              import msgbox
              mb = msgbox.MsgBox(uno.getComponentContext())
              mb.addButton('Howdy')
              mb.show(prompt,0,title)

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

          g_exportedScripts = (ConsoleHandler,)

ຕາມທີ່ຄາດໄວ້, ເມັດທອດ onOkHasFocus ທີ່ຂາດຫາຍໄປຈະສົ່ງຂໍ້ຜິດພາດ (exception) ອອກມາ.

ເບິ່ງໜ້າ ການເອີ້ນໃຊ້ Basic ຈາກ Python ໃນ LibreOffice ສຳລັບຄຳອະທິບາຍຣູທິນ getBasicScript ແລະ ລາຍລະອຽດກ່ຽວກັບການຣັນສະຄຣິບຂ້າມພາສາ.

### ດ້ວຍ LibreOffice Basic

ໃນຕົວຢ່າງນີ້ ໄດອາລັອກແມ່ນຝັງຢູ່ໃນເອກະສານ ແລະ ສາມາດຕັ້ງຢູ່ໃນຄອມພິວເຕີໄດ້ເຊັ່ນກັນ.

          ' <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)) ' ຖ້າເປັນໄດອາລັອກທີ່ຝັງໃນເອກະສານ
              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, _
                  method As String) As Boolean
              ''' 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) ຖ້າເປັນໄດອາລັອກໃນຄອມພິວເຕີ
                  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 » ໂດຍ JM Zambon
          ' https://wiki.openoffice.org/wiki/FR/Documentation/Python/Creating_Dialog_with_Handler

ຕາມທີ່ຄາດໄວ້, ເມັດທອດ onOkHasFocus ທີ່ຂາດຫາຍໄປຈະສົ່ງຂໍ້ຜິດພາດອອກມາ.

ຫົວຂໍ້ທີ່ກ່ຽວຂ້ອງ

ການເອີ້ນໃຊ້ແມັກໂຄຣ Basic ຈາກ Python

ການເປີດໄດອະລັອກດ້ວຍ Basic

ຟັງຊັນ CreateUnoListener

ການສ້າງຕົວຮັບຟັງເຫດການ

ການເປີດໄດອາລັອກດ້ວຍ Python

ການຮັບຟັງເຫດການຂອງເອກະສານ

ຕົວຢ່າງການຂຽນໂປຣແກຣມ Python

ການຊ່ວຍເຫຼືອສະຄຣິບ Python ຂອງ LibreOffice

ກະລຸນາສະໜັບສະໜູນພວກເຮົາ!