ເນື້ອໃນ

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

ເຫດການທີ່ເກີດຈາກໄດອາລັອກ, ເອກະສານ, ຟອມ ຫຼື ຕົວຄວບຄຸມກຣາຟິກ ສາມາດເຊື່ອມໂຍງກັບແມັກໂຄຣໄດ້ ເຊິ່ງເອີ້ນວ່າການຂຽນໂປຣແກຣມທີ່ຂັບເຄື່ອນດ້ວຍເຫດການ. ວິທີທີ່ພົບເລື້ອຍທີ່ສຸດແມ່ນການໃຊ້ແຖບ ເຫດການ ໃນເມນູ ເຄື່ອງມື – ປັບແຕ່ງ ແລະ ໜ້າຕ່າງຄຸນສົມບັດຂອງຕົວຄວບຄຸມໃນ ຕົວແກ້ໄຂໄດອາລັອກ ຈາກເມນູ ເຄື່ອງມື - ແມັກໂຄຣ – ຈັດການໄດອາລັອກ....

ສ່ວນປະກອບກຣາຟິກ, ການປ້ອນຂໍ້ມູນຜ່ານຄີບອດ, ການເຄື່ອນໄຫວເມົາສ໌ ແລະ ການໂຕ້ຕອບອື່ນໆ ສາມາດຄວບຄຸມໄດ້ໂດຍໃຊ້ UNO listeners ທີ່ຕິດຕາມພຶດຕິກຳຂອງຜູ້ໃຊ້. Listeners ແມ່ນທາງເລືອກແບບໄດນາມິກແທນການມອບໝາຍແມັກໂຄຣ. ເຮົາສາມາດສ້າງ UNO listener ໄດ້ຫຼາຍຕົວຕາມເຫດການທີ່ຕ້ອງການຕິດຕາມ. Listener ຕົວດຽວກໍສາມາດຈັດການຕົວຄວບຄຸມສ່ວນຕິດຕໍ່ຜູ້ໃຊ້ໄດ້ຫຼາຍຕົວ.

## ການສ້າງຕົວຮັບຟັງເຫດການ (event listener)

Listeners ຈະຖືກຕິດໃສ່ກັບຕົວຄວບຄຸມໃນໄດອາລັອກ, ລວມເຖິງເຫດການຂອງເອກະສານ ຫຼື ຟອມ. Listeners ຍັງຖືກໃຊ້ເມື່ອສ້າງໄດອາລັອກໃນຂະນະຣັນ ຫຼື ເມື່ອເພີ່ມຕົວຄວບຄຸມໃສ່ໄດອາລັອກແບບທັນທີ.

ຕົວຢ່າງນີ້ສ້າງ listener ສຳລັບຕົວຄວບຄຸມ Button1 ຂອງໄດອາລັອກ Dialog1 ໃນໄລບຣາຣີ Standard.

### ດ້ວຍ 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 ກຳລັງຮັບຟັງ..'
             _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 ໃນໄດເຣັກທໍຣີ {installation}/program/ ມີຕົວຢ່າງບາງອັນຂອງ button listeners.

### ດ້ວຍ LibreOffice Basic

             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

## Event Listeners ອື່ນໆ

Listeners ມັກຈະຖືກຂຽນລະຫັດໄປພ້ອມກັບ ການເປີດໄດອາລັອກ. ມີວິທີການໃຊ້ listener ຫຼາຍຮູບແບບ ເຊັ່ນ event handlers ສຳລັບໄດອາລັອກ ຫຼື event monitors ສຳລັບເອກະສານ ຫຼື ຟອມ.

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

ຕົວຢ່າງການຂຽນໂປຣແກຣມສຳລັບຄອນໂທຣລໃນຕົວແກ້ໄຂໄດອະລັອກ

ຟັງຊັນ CreateUnoListener

ການຈັບຄູ່ເຫດການກັບອອບເຈັກ

ເບິ່ງເພີ່ມເຕີມທີ່ ເຫດການຂອງເອກະສານ, ເຫດການຂອງຟອມ.

ການສ້າງ Dialog Handler

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

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

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