Indhold
Indholdsfortegnelse 🔎︎

# Kalde Basic-makroers fra Python

Du kan kalde LibreOffice Basic-makroer fra Python-scripts og til gengæld kan særlige funktioner opnås som fx:

- Enkle logging-funktioner fra Access2Base-bibliotekets Sporings-konsol

- InputBox og MsgBox-skærm-I/O funktioner er baseret på Basic for at lette Python-udvikling

- Xray-kald afbryder Python script-udførlse for at hjælpe med at inspicerere variabler.

LibreOffice Application Programming Interface (API) Scripting-netværket understøtter mellemsproglige script-udførelse mellem Python og Basic eller andre understøttede programerede sprog for den sags skyld. Argumenter kan passere frem på tværs af kald, forudsat at de repræsenterer primitive data-typer, som begge programmer genkender, og antaget at Scripting-miljøet konverterer den passende.

Det anbefales, at have kendskab til Pythons standardmoduler og LibreOffice API-funktioner inden der udføres mellemsproglige kald fra Python til Basic, JavaScript eller en hvilken som helst anden Script-maskine.

Under kørsel af Python-scripts fra et IDE (Integrated Development Environment = Integreret Udviklingsmiljø) kan den indlejrede Basic-motor i LibreOffice mangle. Undgå Python til LibreOffice Basic-kald i en sådan sammenhæng. Python-miljøet og Universal Networks Objekter (UNO) er fuldt tilgængelige. Se flere oplysninger i Opsætning af et Integreret IDE til Python.

## Hent LibreOffice Basic-scripts

LibreOffice Basic-makroer kan være personlige, delte eller indlejrede i dokumenter. For at udføre dem skal Python afviklingsmiljøet være forsynes med placeringerne af Basic-makroer. Implementering af grænsefladen com.sun.star.script.provider.XScriptProvider tillader genfinding af eksekverbare scripts:

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

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

## Eksekvering af LibreOffice Basic-scripts

The LibreOffice Software Development Kit (SDK) documentation for com.sun.star.script.provider.XScript interface details the calling convention for inter-language calls. Invocation of functions requires three arrays:

- den første oplister argumenterne i den kaldte rutine

- den anden indentificerer ændrede argumenter

- den tredje lagrer returværdierne

### Python Syntaks

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

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

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

### Eksempler på personlige eller delte scripts

Eksempler i Skærm-input/output forklarer detaljeret Python-til-Basic-kald. Overvågning af dokumenthændelser illustrerer brugen af *args Python idiomer til at udskrive en varierende antal af parametre til dialogen i logningskonsollen Access2Base.

På udviklingstidspunktet kan du afbryde eksekveringen af Python-scripts med udvidelsen Xray for at inspicere egenskaber og metoder i UNO-objekter. Udvidelsesfejlfinderen ASPO tillader objektinspektion med udvidelserne Xray eller MRI.

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

### Eksempler på indlejrede scripts i dokumenter

Den forenklede Python *args-syntaks kan bruges i forbindelse med LibreOffice Basic-rutiner, som accepterer et varierende antal argumenter. Under Print og SUM kalder Python -funktioner deres Basic-modsvar Print og SUM med den førnævnte funktion getBasicScript. Undtagelseshåndtering gennemgås ikke.

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

    	  def Print(*args):
    	      """Skriver de specificerede strenge eller numeriske udtryk i et dialogfelt."""
    	      xScript = getBasicScript("Print", "Scripting", embedded=True)
    	      xScript.invoke((args), (), ())

    	  def SUM(*args):
    	      """SUM lægger de specifiecerede taludtryk sammen."""
    	      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,)

De dokument-baserede LibreOffice Basic-rutiner Print and SUM accepterer et varierende antal argumenter. Attributterne Private eller Public har ingen virkning. Tjek af argumenttypen er udeladt for klarhedens skyld

    	  Option Compatible ' "Standard.Scripting" module
    	  Option Explicit

    	  Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
    	      ''' Udskriv stykliste over variabelnumre '''
    	      ' alle CStr()-konvertible args accepteres
    	      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
    	      ''' SUM sammentæl en variabel liste af 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()

Relaterede emner

Kalde Python-scripts fra Basic

Python programmeringseksempler

Hjælp til LibreOffice Pythonscripts

LibreOffice Basic Hjælp