ການຊ່ວຍເຫຼືອ LibreOffice 26.2
ນອກຈາກ ການມອບໝາຍແມັກໂຄຣໃຫ້ກັບເຫດການ ຫຼື ການສ້າງຕົວຮັບຟັງເຫດການ ແລ້ວ, ເຮົາສາມາດໃຊ້ 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:.
ເມັດທອດ createDialogWithHandler ຂອງບໍລິການ com.sun.star.awt.DialogProvider2 ແມ່ນໃຊ້ເພື່ອຕັ້ງຄ່າໄດອາລັອກ ແລະ ຕົວຈັດການຂອງມັນ. ຕົວຈັດການມີໜ້າທີ່ໃນການນຳໃຊ້ສ່ວນຕິດຕໍ່ com.sun.star.awt.XDialogEventHandler.
ຊື່ເມັດທອດຂອງສ່ວນປະກອບທັງໝົດຕ້ອງຖືກປະກາດຢ່າງຈະແຈ້ງເມື່ອໃຊ້ dialog handler.
ໃນຕົວຢ່າງນີ້ ໄດອາລັອກແມ່ນຕັ້ງຢູ່ໃນຄອມພິວເຕີ.
# -*- 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 ແລະ ລາຍລະອຽດກ່ຽວກັບການຣັນສະຄຣິບຂ້າມພາສາ.
ໃນຕົວຢ່າງນີ້ ໄດອາລັອກແມ່ນຝັງຢູ່ໃນເອກະສານ ແລະ ສາມາດຕັ້ງຢູ່ໃນຄອມພິວເຕີໄດ້ເຊັ່ນກັນ.
' <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 ທີ່ຂາດຫາຍໄປຈະສົ່ງຂໍ້ຜິດພາດອອກມາ.