Innhald

# Kalla opp Basic-makroar frå Python

Du kan kalla opp LibreOffice Basic-makroar frå Python-skript. Du kan såleis oppnå spesielle funksjonar som for eksempel

- Enkle logg-funksjonar frå Access2Base-biblioteket sin sporings-konsoll.

- InputBox- og MsgBox-skjerm inn-/ut-funksjonar basert på Basic for å forenkla Python-utviklinga,

- Xray-oppkall avbryt utføringa av Python-skript for å hjelpa til med å inspisera variablane.

Skriptnettverket LibreOffice Application Programming Interface (API) har støtte for å køyra blanda skript mellom Python og Basic, eller andre programmeringsspråk for den saks skuld. Såleis kan argument sendast mellom språka dersom dei er såkalla primitive datatypar som begge språka forstår og at dei vert konverterte korrekt.

Det vert tilrådd at du har kjennskap til standardmodulane i Python og LibreOffice API-funksjonar før du lagar oppkall frå Python til Basic, JavaScript eller andre språk.

Når du køyrer Python-skript frå eit IDE (Integrated Development Environment = Integrert utviklingsmiljø) kan den innebygde Basic-motoren i LibreOffice mangla. Då må du unngå oppkall frå Python til LibreOffice Basic. Python-miljøet og Universal Networks Objekter (UNO) er fult tilgjengelege. Du finn meir om dette i Oppsetjing av Integrert IDE til Python.

## Hent LibreOffice Basic-skript

LibreOffice Basic-makroar kan vera personlege, delte eller innebygde i dokumenta. For å køyra dei, må Python-køyretid vera oppført med grunnleggjande makroplasseringar. Implementering av grensesnittet com.sun.star.script.provider.XScriptProvider tillèt henting av køyrbare skript:

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

    		 def getBasicScript(macro='Main', module='Module1', library='Standard',
    		         isEmbedded=False) -> XScript:
    		     '''Hent Basic-skript-objekt før bruk.'''
    		     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

## Køyrer LibreOffice Basic-skript

LibreOffice Software Development Kit (SDK) sin dokumentasjon for grensesnittet com.sun.star.script.provider.XScriptforklarar reglane for oppkall av mellomspråkelege oppkall. Funksjonsoppkallet krev tre tabellar:

- den første inneheld argumenta brukte i den oppkalla rutinen

- den andre identifiserer argument som er endra

- den tredje lagrar dei returnerte verdiane

### Python-syntaks

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

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

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

### Eksempel på personlege eller delte skript

Eksempla i Input/Output to Screen forklarar i detalj oppkall frå Python til Basic. Monitoring Document Events viser bruk av *args Python-formspråk for å skriva ut varierande mengde parametrar til dialogvindauget med logkonsollen for Access2Base.

På utviklingsstadiet kan du avbryta Python-skriptkøyringa ved hjelp av Xray extension for å sjå på eigenskapar og metodar for UNO-objekt. Utvidinga APSO-feilsøkingsprogrammet tillèt objektinspeksjon ved hjelp av anten Xray- eller MR-utvidingar.

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

### Eksempel på innebygde skript i dokument

Den forenkla Python-syntaksen *args kan brukast i samband med LibreOffice Basic-rutinar som godtar ei varierande meng argument. Under Print og SUM kallar Python-funksjonane dei tilsvarande Basic-funksjonane Print og SUM med den nemnde funksjonen getBasicScript. Unntakshandsaminga er ikkje detaljert.

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

    	  def Print(*args):
    	      """Skriv ut dei valde strengane eller numeriske uttrykka i eit dialogvindauge."""
    	      xScript = getBasicScript("Print", "Scripting", embedded=True)
    	      xScript.invoke((args), (), ())

    	  def SUM(*args):
    	      """SUMmerer det gjevne taluttrykket."""
    	      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,)

Dei dokumentbaserte LibreOffice Basic-rutinane Print og SUM godtar ei varierande mengd argument. Attributta Private og Public har ingen effekt. Kontroll av argumenttypen er sløyfa for å gjere oppstillinga tydlegare.

    	  Option Compatible ' "Standard.Scripting" module
    	  Option Explicit

    	  Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
    	      ''' Skriv ut artikkellista over variable tal '''
    	      ' alle CStr() som kan konverterast er gyldige
    	      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
    	      ''' SUMmerer ei variabel liste med tal '''
    	      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()

Liknande emne

Oppkall av Python-skript frå Basic

Pythonprogrammering, eksempel

LibreOffice Pythonskript hjelp

Hjelp for LibreOffice Basic