libreoffice
我长期以来一直答应撰写有关脚本语言Basic和在LibreOffice中创建宏的文章。 本文致力于LibreOffice Basic中使用的数据类型,并且在更大程度上致力于变量的描述以及使用它们的规则。 我将尝试为高级用户和新手用户提供足够的信息。
(并且,我要感谢所有对此俄语文章进行评论并提出建议的人,特别是那些帮助回答难题的人。)
以下是正确的变量名称的一些示例:
MyNumber =
5
MyNumber5 =
15
MyNumber_5 =
20
_MyNumber =
96
[ My Number
] =
20.5
[ 5MyNumber
] =
12
[ Number,Mine
] =
12
[ DéjàVu
] =
"It seems that I have seen it!"
[ Моя переменная
] =
"The first has went!"
[ Мой
% от зделки
] =
0.0001
注意:在包含方括号的示例中,如果删除方括号,宏将显示带有错误的窗口。 如您所见,可以使用本地化的变量名。 这样做是否有意义取决于您。
严格来说,没有必要在LibreOffice Basic中声明变量(数组除外)。 如果您从两行代码中编写宏以处理小型文档,则无需声明变量,因为变量将自动声明为变量类型。 对于较长的宏或将在大型文档中使用的宏,强烈建议声明变量。 首先,它增加了文本的可读性。 其次,它允许您控制可以极大地促进错误查找的变量。 第三,变体类型非常耗资源,并且隐藏转换需要大量时间。 此外,变量类型不会为数据选择最佳变量类型,这会增加计算机资源的工作量。
如果您喜欢使用匈牙利表示法,则Basic可以通过其前缀(名称中的第一个字母)自动分配变量类型,以简化工作。 为此,使用语句DefXXX 。 XXX是字母类型名称。 带字母的语句将在模块中工作,并且必须在子程序和功能出现之前指定该语句。 有11种类型:
DefBool -
for boolean variables;
DefInt -
for integer variables of
type Integer;
DefLng -
for integer variables of
type Long Integer;
DefSng -
for variables with a single-precision floating point;
DefDbl -
for variables with double-precision floating-point
type Double;
DefCur -
for variables with a fixed point of
type Currency;
DefStr -
for string variables;
DefDate -
for
date and
time variables;
DefVar -
for variables of Variant
type ;
DefObj -
for object variables;
DefErr -
for object variables containing error information.
如果您已经对LibreOffice Basic中的变量类型有所了解,您可能会注意到该列表中没有Byte类型,但是其中有一个Error类型的怪兽 。 不幸的是,您只需要记住这一点。 我还没有发现为什么这是真的。 此方法很方便,因为类型是自动分配给变量的。 但是它不允许您在变量名中查找与错字有关的错误。 此外,将不可能指定非拉丁字母; 也就是说,必须明确声明在方括号中需要声明的所有变量名称。
为了避免在显式使用声明的变量时出现拼写错误,可以使用语句OPTION EXPLICIT 。 该语句应为模块中的第一行代码。 除注释外,所有其他命令都应放在其后。 该语句告诉解释器,必须显式声明所有变量。 否则,将产生错误。 自然,此语句使在代码中使用Def语句毫无意义。
使用语句Dim声明变量。 如果用逗号分隔变量名称,则可以同时声明多个变量,甚至可以声明不同的类型。 要使用显式声明确定变量的类型,可以在名称后使用相应的关键字或类型声明符号。 如果在变量后未使用类型声明符号或关键字,则将自动为其分配Variant类型。 例如:
Dim iMyVar
'variable of Variant type
Dim iMyVar1 As Integer, iMyVar2 As Integer '
in both cases Integer
type
Dim iMyVar3, iMyVar4 As Integer
'in this case the first variable
' is Variant, and the second is Integer
LibreOffice Basic支持七类变量:
布尔类型的变量只能包含两个值之一: TRUE或FALSE 。 在数值等效中,值FALSE对应于数字0,值TRUE对应于-1 (负1)。 传递给布尔类型变量的除零以外的任何值都将转换为TRUE ; 也就是说,转换为负数。 您可以通过以下方式显式声明变量:
Dim MyBoolVar As Boolean
我没有找到一个特殊的符号。 对于隐式声明,可以使用DefBool语句。 例如:
DefBool b 'variables beginning with b by default are the type Boolean
变量的初始值设置为FALSE 。 布尔变量需要一个字节的内存。
有三种类型的整数变量: Byte , Integer和Long Integer 。 这些变量只能包含整数。 当您将带有小数的数字转移到此类变量中时,它们将根据经典算术规则进行四舍五入(而不是如帮助部分所述,移至较大的一面)。 这些变量的初始值为0(零)。
字节类型的变量只能包含0到255之间的整数正值。不要将此类型与信息的物理大小(以字节为单位)混淆。 尽管我们可以将十六进制数字记为变量,但是单词“ Byte”仅表示数字的维数。 您可以如下声明此类型的变量:
Dim MyByteVar As Byte
该类型没有类型声明符号。 没有此类型的语句Def。 由于其尺寸较小,因此这种类型对于循环索引(其值不会超出范围)最方便。 一个字节变量需要一个字节的内存。
Integer类型的变量可以包含-32768至32767的整数值。它们便于以整数快速计算,并且适合于循环索引。 %是类型声明符号。 您可以通过以下方式声明此类型的变量:
Dim MyIntegerVar
%
Dim MyIntegerVar As Integer
对于隐式声明,可以使用DefInt语句。 例如:
DefInt i 'variables starting with i by default have type Integer
一个Integer变量需要两个字节的内存。
Long Integer类型的变量可以包含-2147483648到2147483647之间的整数值。当Integer类型的范围不足以实现算法时,Long Integer变量在整数计算中很方便。 &是类型声明符号。 您可以通过以下方式声明此类型的变量:
Dim MyLongVar
&
Dim MyLongVar As Long
对于隐式声明,可以使用DefLng语句。 例如:
DefLng l 'variables starting with l have Long by default
Long Integer变量需要四个字节的内存。
这些类型的所有变量都可以取带分数的正数或负数。 它们的初始值为0(零)。 如上所述,如果将带分数的数字分配给只能包含整数的变量,则LibreOffice Basic会根据经典算术规则对数字进行四舍五入。
单个变量可以取正值或负值,范围为3.402823x10E + 38至1.401293x10E-38。 这种类型的变量的值采用单精度浮点格式。 在这种格式下,仅存储八个数字字符,其余以十进制(数字顺序)存储。 在Basic IDE调试器中,您只能看到6个小数位,但这是一个公然的谎言。 使用Single类型变量的计算要比Integer变量花费更长的时间,但是它们比使用Double类型变量的计算要快。 类型声明符号为! 。 您可以通过以下方式声明此类型的变量:
Dim MySingleVar
!
Dim MySingleVar As Single
对于隐式声明,可以使用DefSng语句。 例如:
DefSng f 'variables starting with f have the Single type by default
单个变量需要四个字节的内存。
Double类型的变量可以采用正值或负值,范围为1.79769313486231598x10E308至1.0x10E-307。 为什么范围如此奇怪? 在解释器中最有可能导致这种情况的其他检查。 Double类型的变量的值采用双精度浮点格式,可以有15个小数位。 在Basic IDE调试器中,您只能看到14个小数位,但这也是一个公然的谎言。 Double类型的变量适用于精确计算。 与单类型相比,计算需要更多时间。 类型声明符号为# 。 您可以通过以下方式声明此类型的变量:
Dim MyDoubleVar
#
Dim MyDoubleVar As Double
对于隐式声明,可以使用DefDbl语句。 例如:
DefDbl d 'variables beginning with d have the type Double by default
Double类型的变量需要8个字节的内存。
货币类型的变量显示为带固定点的数字,数字的整数部分具有15个符号,而小数则具有4个符号。 值范围包括从-922337203685477.6874到+92337203685477.6874的数字。 货币类型的变量用于精确计算货币值。 类型声明符号为@ 。 您可以通过以下方式声明此类型的变量:
Dim MyCurrencyVar
@
Dim MyCurrencyVar As Currency
对于隐式声明,可以使用DefCur语句。 例如:
DefCur c 'variables beginning with c have the type Currency by default
货币变量需要8个字节的内存。
String类型的变量可以包含字符串,其中每个字符都存储为相应的Unicode值。 它们用于处理文本信息,除了打印的字符(符号)之外,它们还可以包含不可打印的字符。 我不知道该行的最大大小。 Mike Kaganski实验性地将该值设置为2147483638个字符,此后LibreOffice退出。 这相当于将近4 GB的字符。 类型声明符号为$ 。 您可以通过以下方式声明此类型的变量:
Dim MyStringVar$
Dim MyStringVar As String
对于隐式声明,可以使用DefStr语句。 例如:
DefStr s 'variables starting with s have the String type by default
这些变量的初始值为空字符串(“”)。 存储字符串变量所需的内存取决于变量中的字符数。
日期类型的变量只能包含以内部格式存储的日期和时间值。 实际上,此内部格式是双精度浮点格式(Double),其中整数部分是天数,而小数部分是一天的一部分(即0.00001157407是一秒)。 值0等于30.12.1899。 基本解释器在输出时会自动将其转换为可读版本,但在加载时不会自动将其转换为可读版本。 您可以使用Dateserial,Datevalue,Timeserial或Timevalue函数快速转换为Date类型的内部格式。 要从日期格式的变量中提取某个部分,可以使用日,月,年,时,分或秒功能。 内部格式允许我们通过计算两个数字之间的差异来比较日期和时间值。 Date类型没有类型声明,因此,如果您明确定义它,则需要使用Date关键字。
Dim MyDateVar As Date
对于隐式声明,可以使用DefDate语句。 例如:
DefDate y 'variables starting with y have the Date type by default
Date变量需要8个字节的内存。
对象变量的类型
我们可以将LibreOffice Basic的两种变量类型用于对象。
对象类型的变量是存储对象的变量。 通常,对象是程序中任何具有结构,属性以及访问和数据处理方法的独立部分。 例如,文档,单元格,段落和对话框都是对象。 它们具有名称,大小,属性和方法。 这些对象又由对象组成,而对象又可以由对象组成。 这种对象的“金字塔”通常称为对象模型,它使我们在开发小对象时可以将它们组合成更大的对象。 通过较大的对象,我们可以访问较小的对象。 这使我们可以处理文档,在从特定文档中提取文档时创建和处理它们。 没有针对Object类型的类型声明,因此对于显式定义,您需要使用Object关键字。
Dim MyObjectVar As Object
对于隐式声明,可以使用DefObj语句。 例如:
DefObj o 'variables beginning with o have the type Object by default
对象类型的变量本身并不存储对象,而仅是对其的引用。 这种类型的变量的初始值为Null。
该结构本质上是一个对象。 如果您在Basic IDE调试器中查看,则大多数(但不是全部)是对象类型。 有些不是; 例如,错误的结构具有错误类型。 但是粗略地说,LibreOffice Basic中的结构只是简单地分组为一个对象变量,而无需特殊的访问方法。 另一个重大区别是,在声明结构类型的变量时,必须指定其名称,而不是对象。 例如,如果MyNewStructure是结构的名称,则其变量的声明将如下所示:
Dim MyStructureVar As MyNewStructure
有很多内置结构,但用户可以创建个人的结构。 当我们需要处理应视为一个整体的异类信息集时,结构会很方便。 例如,要创建一个tPerson结构:
Type tPerson
Name As String
Age As Integer
Weight As Double
End Type
结构的定义应该放在使用它的子例程和函数之前。
要填充结构,可以使用例如内置结构com.sun.star.beans.PropertyValue:
Dim oProp As New com.sun.star.beans.PropertyValue
OProp.Name =
"Age"
'Set the Name
OProp.Value = "Amy Boyer" ' Set the Property
为了简化结构的填充,可以使用With运算符。
Dim oProp As New com.sun.star.beans.PropertyValue
With oProp
.Name =
"Age"
'Set the Name
.Value = "Amy Boyer" ' Set the Property
End With
初始值仅适用于结构中的每个变量,并且对应于变量的类型。
这是变量的虚拟类型。 自动为要操作的数据选择“变量”类型。 唯一的问题是解释器不需要节省我们的资源,并且它不提供变量类型的最佳变体。 例如,它不知道可以在Byte中写入1,而在Long Integer中写入100000,尽管如果值是从具有声明类型的另一个变量传递来的,则它会复制一个类型。 同样,转换本身也需要大量资源。 因此,此类变量是所有变量中最慢的。 如果需要声明这种变量,则可以使用Variant关键字。 但是,您可以完全省略类型描述。 Variant类型将自动分配。 该类型没有类型声明符号。
Dim MyVariantVar
Dim MyVariantVar As Variant
对于隐式声明,可以使用DefVar语句。 例如:
DefVar v 'variables starting with v have the Variant type by default
默认情况下,此变量类型分配给所有未声明的变量。
数组是数据集形式的一种特殊类型的变量,让人想起数学矩阵,只是数据可以是不同类型的数据,并允许人们按索引(元素编号)访问其元素。 当然,一维数组将类似于列或行,而二维数组将类似于表。 LibreOffice Basic中数组的一项功能将其与其他编程语言区分开。 因为我们有一个抽象类型的variant,所以数组的元素不需要是同质的。 也就是说,如果存在一个数组MyArray,并且它具有从0到2编号的三个元素,我们将名称写在MyArray(0)的第一个元素中,将年龄写在第二个MyArray(1)中,并将权重写在第三个MyArray(2),我们可以分别具有以下类型值:MyArray(0)的字符串,MyArray(1)的整数和MyArray(2)的Double。 在这种情况下,数组将类似于具有通过其索引访问元素的能力的结构。 数组元素也可以是同质的:LibreOffice Basic中可以使用其他数组,对象,结构,字符串或任何其他数据类型。
数组必须在使用前声明。 尽管索引空间可以在Integer类型的范围内-从-32768到32767-默认情况下,初始索引被选择为0。您可以通过几种方式声明数组:
Dim MyArrayVar(5) as string | 具有从0到5的6个元素的字符串数组 |
Dim MyArrayVar$(5) | 与以前一样 |
Dim MyArrayVar(1 To 5) as string | 具有1到5的5个元素的字符串数组 |
Dim MyArrayVar(5,5) as string | 包含36个元素的行的二维数组,每个级别都有索引 从0到5 |
Dim MyArrayVar$(-4 To 5, -4 To 5) | 具有100个元素的二维字符串数组,每个级别都有索引 从-4到5 |
Dim MyArrayVar() | 空数组的变量类型 |
默认情况下,您可以使用Option Base语句更改数组的下限(数组的第一个元素的索引)。 在使用子程序,函数和定义用户结构之前必须指定这些参数。 Option Base只能采用两个值,即0或1,必须紧随关键字之后。 该操作仅适用于当前模块。
如果您只是刚开始编程,那么Wikipedia将提供有关数组 ,结构和许多其他主题的常规信息。
对于LibreOffice Basic的更深入研究, Andrew Pitonyak的网站以及Basic Programmer's guide都是最重要的资源。 您也可以使用LibreOffice 联机帮助 。 完整的流行宏可以在The Document Foundation Wiki的“ 宏”部分中找到,您还可以在该主题中找到其他链接。
有关更多提示或提出问题,请访问Ask LibreOffice和OpenOffice论坛 。
翻译自: https://opensource.com/article/18/2/variables-data-types-libreoffice-basic
libreoffice