ເນື້ອໃນ

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

ທ່ານສາມາດເອີ້ນໃຊ້ແມັກໂຄຣ LibreOffice Basic ຈາກສະຄຣິບ Python ໄດ້, ແລະ ຈະໄດ້ຮັບຄຸນສົມບັດທີ່ໂດດເດັ່ນກັບຄືນມາ ເຊັ່ນ:

- ລະບົບການບັນທຶກລັອກແບບງ່າຍດາຍຈາກຄອນໂຊນ Trace ຂອງໄລບຣາຣີ Access2Base,

- ຟັງຊັນ I/O ຫນ້າຈໍ InputBox ແລະ MsgBox ທີ່ອີງໃສ່ Basic ເພື່ອຄວາມສະດວກໃນການພັດທະນາ Python,

- ການເອີ້ນໃຊ້ Xray ເພື່ອຢຸດການເຮັດວຽກຂອງສະຄຣິບ Python ຊົ່ວຄາວ ເພື່ອຊ່ວຍໃນການກວດສອບຕົວປ່ຽນ.

ໂຄງຮ່າງການຂຽນສະຄຣິບ API ຂອງ LibreOffice ຮອງຮັບການຣັນສະຄຣິບຂ້າມພາສາລະຫວ່າງ Python ແລະ Basic ຫຼື ພາສາອື່ນໆທີ່ຮອງຮັບ. ອາຄິວເມນ (Arguments) ສາມາດສົ່ງໄປມາໄດ້ລະຫວ່າງການເອີ້ນໃຊ້, ໂດຍມີເງື່ອນໄຂວ່າ ຕ້ອງເປັນປະເພດຂໍ້ມູນພື້ນຖານທີ່ທັງສອງພາສາຮູ້ຈັກ ແລະ ໂຄງຮ່າງການຂຽນສະຄຣິບຈະແປງພວກມັນໃຫ້ຢ່າງເໝາະສົມ.

ຂໍແນະນຳໃຫ້ມີຄວາມຮູ້ກ່ຽວກັບໂມດູນມາດຕະຖານຂອງ Python ແລະ ຄຸນສົມບັດຂອງ LibreOffice API ກ່ອນທີ່ຈະເຮັດການເອີ້ນໃຊ້ຂ້າມພາສາຈາກ Python ໄປຫາ Basic, JavaScript ຫຼື ເຄື່ອງຈັກສະຄຣິບອື່ນໆ.

ເມື່ອຣັນສະຄຣິບ Python ຈາກສະພາບແວດລ້ອມການພັດທະນາແບບເບັດເສັດ (IDE), ເຄື່ອງຈັກ Basic ທີ່ຝັງຢູ່ໃນ LibreOffice ອາດຈະບໍ່ມີຢູ່. ໃຫ້ຫຼີກເວັ້ນການເອີ້ນໃຊ້ Python-to-LibreOffice Basic ໃນສະຖານະການດັ່ງກ່າວ. ຢ່າງໃດກໍຕາມ, ສະພາບແວດລ້ອມ Python ແລະ Universal Networks Objects (UNO) ແມ່ນສາມາດໃຊ້ງານໄດ້ຢ່າງເຕັມສ່ວນ. ເບິ່ງຂໍ້ມູນເພີ່ມເຕີມໄດ້ທີ່ ການຕັ້ງຄ່າ IDE ສຳລັບ Python.

## ການດຶງຂໍ້ມູນສະຄຣິບ LibreOffice Basic

ແມັກໂຄຣ LibreOffice Basic ສາມາດເປັນແບບສ່ວນຕົວ, ແບບແບ່ງປັນ ຫຼື ແບບຝັງຢູ່ໃນເອກະສານ. ເພື່ອຣັນພວກມັນ, ລະບົບ Python ຈຳເປັນຕ້ອງຮູ້ຕຳແໜ່ງຂອງແມັກໂຄຣ Basic. ການນຳໃຊ້ສ່ວນຕິດຕໍ່ com.sun.star.script.provider.XScriptProvider ຊ່ວຍໃຫ້ສາມາດດຶງສະຄຣິບທີ່ພ້ອມຣັນໄດ້:

    		 import uno
    		 from com.sun.star.script.provider import Xscript

    		 def getBasicScript(macro='Main', module='Module1', library='Standard',
    		         isEmbedded=False) -> XScript:
    		     '''ດຶງເອົາອອບເຈັກສະຄຣິບ Basic ກ່ອນທີ່ຈະເອີ້ນໃຊ້.'''
    		     ctx = uno.getComponentContext()
    		     smgr = ctx.ServiceManager
    		     if isEmbedded:
    		         desktop = smgr.createInstanceWithContext('com.sun.star.frame.Desktop', ctx)
    		         scriptPro = desktop.CurrentComponent.getScriptProvider()
    		         location = "document"
    		     else:
    		         mspf = smgr.createInstanceWithContext(
    		             "com.sun.star.script.provider.MasterScriptProviderFactory", ctx)
    		         scriptPro = mspf.createScriptProvider("")
    		         location = "application"
    		     scriptName = "vnd.sun.star.script:"+library+"."+module+"."+macro+ \
    		                  "?language=Basic&location="+location
    		     xScript = scriptPro.getScript(scriptName)
    		     return xScript

## ການຣັນສະຄຣິບ LibreOffice Basic

ເອກະສານຂອງຊຸດພັດທະນາຊອບແວ (SDK) LibreOffice ສຳລັບສ່ວນຕິດຕໍ່ com.sun.star.script.provider.XScript ໃຫ້ລາຍລະອຽດກ່ຽວກັບວິທີການເອີ້ນໃຊ້ຂ້າມພາສາ. ການເອີ້ນໃຊ້ຟັງຊັນຕ້ອງໃຊ້ ອາເຣ (Array) ສາມຊຸດ:

- ຊຸດທຳອິດແມ່ນລາຍການອາຄິວເມນຂອງຣູທິນທີ່ຖືກເອີ້ນ

- ຊຸດທີສອງແມ່ນລະບຸອາຄິວເມນທີ່ຖືກແກ້ໄຂ

- ຊຸດທີສາມແມ່ນເກັບຄ່າທີ່ສົ່ງກັບຄືນມາ

### ໄວຍາກອນ Python

results = script.invoke((prompt,buttons,title), (), ())

script.invoke((message,), tuple, ())

script.invoke((args), (), results)

### ຕົວຢ່າງຂອງສະຄຣິບສ່ວນຕົວ ຫຼື ແບບແບ່ງປັນ

ຕົວຢ່າງໃນ ການນຳເຂົ້າ/ສົ່ງອອກ ຫາໜ້າຈໍ ໃຫ້ລາຍລະອຽດກ່ຽວກັບການເອີ້ນໃຊ້ Python ຫາ Basic. ການຕິດຕາມເຫດການຂອງເອກະສານ ສະແດງໃຫ້ເຫັນການໃຊ້ *args ຂອງ Python ເພື່ອສະແດງຜົນພາຣາມິເຕີຫຼາຍຕົວໄປຫາໄດອາລັອກຄອນໂຊນລັອກຂອງ Access2Base.

ໃນລະຫວ່າງການພັດທະນາ, ທ່ານສາມາດຢຸດການຣັນສະຄຣິບ Python ໄດ້ໂດຍການໃຊ້ ສ່ວນຂະຫຍາຍ Xray ເພື່ອກວດສອບຄຸນສົມບັດ ແລະ ເມັດທອດ (methods) ຂອງອອບເຈັກ UNO. ຕົວດີບັກ (debugger) ຂອງສ່ວນຂະຫຍາຍ APSO ຊ່ວຍໃຫ້ສາມາດກວດສອບອອບເຈັກໄດ້ໂດຍໃຊ້ສ່ວນຂະຫຍາຍ Xray ຫຼື MRI.

    	  def xray(myObject):
    	  	  script = getBasicScript(library="XrayTool", module="_Main", macro="Xray")
    	  	  script.invoke((myObject,), (), ())

### ຕົວຢ່າງຂອງສະຄຣິບທີ່ຝັງຢູ່ໃນເອກະສານ

ໄວຍາກອນ *args ແບບງ່າຍຂອງ Python ສາມາດໃຊ້ຮ່ວມກັບຣູທິນຂອງ LibreOffice Basic ທີ່ຮອງຮັບອາຄິວເມນຫຼາຍຕົວ. ຂ້າງລຸ່ມນີ້ ຟັງຊັນ Print ແລະ SUM ຂອງ Python ຈະເອີ້ນໃຊ້ Print ແລະ SUM ຂອງ Basic ໂດຍໃຊ້ຟັງຊັນ getBasicScript ທີ່ກ່າວມາຂ້າງເທິງ. ການຈັດການຂໍ້ຜິດພາດ (Exception handling) ແມ່ນບໍ່ໄດ້ລະບຸໄວ້ລະອຽດ.

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

    	  def Print(*args):
    	      """ສະແດງຂໍ້ຄວາມ ຫຼື ຄ່າຕົວເລກທີ່ລະບຸໄວ້ໃນກ່ອງໄດອາລັອກ."""
    	      xScript = getBasicScript("Print", "Scripting", embedded=True)
    	      xScript.invoke((args), (), ())

    	  def SUM(*args):
    	      """ລວມຍອດຄ່າຕົວເລກທີ່ລະບຸໄວ້."""
    	      xScript = getBasicScript("SUM", "Scripting", embedded=True)
    	      res = xScript.invoke((args), (), ())
    	      return res[0]

    	  # def getBasicScript()  # see above

    	  def playWithArgs():
    	      Print("Fun with *args ", -9.81, 297864.681974, 8762E-137)
    	      Print(SUM(45, -9.81, 297864.681974))
    	      Print(SUM(45, -9.81, 297864.681974, 8762E+137))

    	  g_exportedScripts = (playWithArgs,)

ຣູທິນ Print ແລະ SUM ໃນ Basic ຂອງ LibreOffice ຮອງຮັບອາຄິວເມນຫຼາຍຕົວ. ຄຸນລັກສະນະ Private ຫຼື Public ບໍ່ມີຜົນຫຍັງ. ການກວດສອບປະເພດອາຄິວເມນແມ່ນຂ້າມໄປເພື່ອຄວາມຊັດເຈນ.

    	  Option Compatible ' "Standard.Scripting" module
    	  Option Explicit

    	  Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
    	      ''' ສະແດງລາຍການທີ່ມີຈຳນວນຕົວແປບໍ່ຄົງທີ່ '''
    	      ' ຍອມຮັບທຸກອາຄິວເມນທີ່ສາມາດແປງດ້ວຍ CStr() ໄດ້
    	      Dim str As String, i As Integer
    	      If UBound(args) >= 0 Then
    	          For i = 0 To UBound(args)
    	              str = str + Cstr(args(i))+ sep
    	          Next i
    	      End If
    	      Print str
    	  End Sub ' Standard.Scripting.Print()

    	  Public Function SUM(ParamArray args() As Variant) As Variant
    	      ''' ລວມຍອດລາຍການຕົວເລກ '''
    	      Dim ndx As Integer
    	      If UBound(args) >= 0 Then
    	          For ndx = 0 To UBound(args)
    	              SUM = SUM + args(ndx)
    	          Next ndx
    	      End If
    	  End Function ' Standard.Scripting.SUM()

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

ການຮຽກໃຊ້ສະຄຣິບ Python ຈາກ Basic

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

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

ວິທີໃຊ້ LibreOffice Basic

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