Module
Contents
Index 🔎︎

# 使用过程和函数

下面介绍 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