模块
目录
索引 🔎︎

# 使用过程和函数

下面介绍 LibreOffice Basic 中过程和函数的基本用法。

在建立新模块时，LibreOffice Basic 会自动插入一个名为「Main」的子程序。这个默认名称与 LibreOffice Basic 项目的顺序和起始点无关。可以将此子程序重命名为其他名称，而不会带来问题。

对您 public 变量、sub 与函数名称的一些限制。您不能使用与同库模块相同的名称。

利用过程和函数，可以将一个程序划分为多个逻辑片段，有助于使程序保持结构化。

使用过程和函数的一个好处是，如果为项目开发的程序代码含有任务组件，则可以将此代码用于其他项目。

## 向过程和函数传送变量

可以向过程和函数传送变量，但必须在子程序或函数中声明所需的参数:

    Sub SubName(Parameter1 As Type, Parameter2 As Type,...)
    程序代码
    End Sub

调用子程序时使用以下语法:

    SubName(Value1, Value2,...)

传送到子程序的参数必须与子程序声明中指定的参数匹配。

同样，传送到函数的参数也必须与函数声明中指定的参数匹配，以便正常返回函数结果。通过将函数名称作为参数，并向其指定该函数的返回值，可以在函数结束之前直接定义返回结果 (请参阅示例):

    Function FunctionName(Parameter1 As Type, Parameter2 As Type,...) As Type
    程序代码
    函数名称=结果
    End Function

调用函数时使用以下语法:

    Variable=FunctionName(Parameter1, Parameter2,...)

也可以用完整的名称调用过程或函数:
Library.Module.Macro()
例如，要从 Gimmicks 库中调用 Autotext 宏，可使用命令:
Gimmicks.AutoText.Main()

## 通过值或引用传送变量

可以通过引用或值将参数传送到子程序或函数。除非特别指定，通常是通过引用传送参数。这意味着子程序或函数可以获取该参数，并且可用读取和修改参数值。

如果希望通过值传送参数，请在调用子程序或函数时，在参数前插入关键字 "ByVal"，例如:

    Result = Function(ByVal Parameter)

在这种情况下，函数不会修改参数的原始内容，因为它获得的仅仅是参数值而不是参数本身。

## 变量范围

在某个子程序或函数中定义的变量仅在该过程中有效。这种变量被称为「局部」变量。在很多情况下，您需要定义在所有过程中、所有程序库的各个模块中或者在退出子程序或函数后仍有效的变量。

### 在子程序或函数之外声明变量

    Global VarName As TYPENAME

只要 LibreOffice 会话未结束，变量就有效。

    Public VarName As TYPENAME

变量在所有模块中均有效。

    Private VarName As TYPENAME

变量仅在当前模块中有效。

    Dim VarName As TYPENAME

变量仅在当前模块中有效。

### 私有变量示例

通过设置 CompatibilityMode(true) 使私有变量在模块间私有。

    ' ***** Module1 *****
    Private myText As String
    Sub initMyText
        myText = "Hello"
        Print "现在在 module1 中: ", myText
    End Sub

    ' ***** Module2 *****
    'Option Explicit
    Sub demoBug
        CompatibilityMode( true )
        initMyText
        ' 现在返回空字符串
        '  (或者出现 Option Explicit 错误)
        Print "现在在 module2 中: ", myText
    End Sub

### 退出子程序或函数后保存变量内容

    Static VarName As TYPENAME

变量的值一直有效，直到下次进入函数或子程序。 声明必须存在于子程序或者函数之内。

## 指定函数的返回值

与变量一样，函数名称后必须含有类型声明字符或由「As」与相应关键字 (位于参数列表末尾) 指示的类型，以定义函数返回值的类型。例如:

    Function WordCount(WordText As String) As Integer