libreoffice basic中运行时通过代码添加子例程的方法

问题描述 投票:0回答:1

libreoffice basic中有没有办法在运行时通过代码添加/删除子例程或函数?

我非常希望能够在运行时通过代码创建、删除和运行子例程或函数。我认为这是绕过 libreoffice-basic 中缺乏接口(无法进行依赖倒置)的一种方法。

libreoffice basic libreoffice-basic openoffice-basic
1个回答
0
投票

感谢JohnSUN。所以看来你可以使用字符串名称运行宏(尽管这很难)。只需检查以下代码即可。

这里是示例代码(太长,由你来清理)

REM CALL A USER-DEFINED FUNCTION FROM AN ARBITRARY LIBRARY
REM Parameters: 
REM funcName - string - name of the user-defined function
REM inpParams - an array of parameters passed to the function (can be empty)
REM libName - string - library Name (default "Standard")
REM In case of an error (no library, no function found, error in the function itself)
REM returns Nothing. Otherwise, the result of execution
REM custom function with the specified parameters.
REM Author: Vladyslav Orlov aka JohnSUN, Ukraine, Kyiv, 2011
REM mailto: [email protected]
Function runMacro(funcName As String, Optional inpParams As Variant, Optional libName)
    Dim oScriptProvider As Object   
    Dim oLib As Object              
    Dim oScript As Object           
    Dim oModuleNames As Object      
    Dim i%                          
    Dim aOutParamIndex(), aOutParam()   ' Dummy arrays, read https://wiki.openoffice.org/wiki/Documentation/DevGuide/Scripting/Scripting_Framework_URI_Specification
    Dim macroName As String         
    Const prefix="vnd.sun.star.script:"
    Const suffix="?language=Basic&location=document"
    runMacro = Nothing
    If IsMissing(inpParams) Then inpParams = Array()
    If Not IsArray(inpParams) Then inpParams = Array(inpParams)
    If IsMissing(libName) Then libName = "Standard"
    BasicLibraries.LoadLibrary(libName)
    If NOT BasicLibraries.isLibraryLoaded(LibName) Then Exit Function
    oLib = BasicLibraries.getByName(libName)
    oScriptProvider = ThisComponent.ScriptProvider
    
    oModuleNames = oLib.getElementNames()
    On Local Error GOTO NextIteration
    For i = LBound(oModuleNames) To UBound(oModuleNames)
        macroName = prefix & libName & "." & oModuleNames(i) & "." & funcName & suffix
        oScript = oScriptProvider.getScript(macroName)
        runMacro = oScript.invoke(inpParams, aOutParamIndex, aOutParam)
        Exit Function
NextIteration:
    Next i
End Function

下面是调用的函数:

REM Macros available for running:

Sub Main
    display("dum", "Fn0")
    display("dum", "Fn1")
End Sub

' FUNCTION USED

Sub display(sFuncName As String, Optional param)
  msgbox (runMacro(sFuncName, param))
End Sub 

Function dum(sFuncName As String) As String 
    dum = "This is DUM(" & sFuncName & "(0)) = " & runMacro(sFuncName, 0) & Chr(10) & _
          "and is DUM(" & sFuncName & "(1)) = " &   runMacro(sFuncName, 1)
End Function 

Function Fn0(iVal As Integer) As String 
    Fn0 = "From Fn0 (" & iVal & ") "
End Function 

Function Fn1(iVal As Integer) As Integer
Static add As Long 
    add = add + 5
    Fn1 = iVal + add
End Function 
© www.soinside.com 2019 - 2024. All rights reserved.