级别: 中级 Tim Robinson, 高级软件工程师, IBM
2009 年 8 月 24 日 本文提供了一个分步向导,教您如何开始使用 OpenOffice.org BASIC 进行 IBM® Lotus® Symphony™ 宏编程。本文介绍了宏编辑器,演示如何为 Lotus Symphony 文档添加控件对象,展示如何关联控件事件和宏,以及介绍如何从 Lotus Symphony 电子表格中获取数据。
编辑注:对这个主题了解很多?希望分享您的知识?那么立刻加入到 IBM Lotus 软件 wiki 项目中吧。
简介
IBM Lotus Symphony 支持使用 OpenOffice.org Basic 语言进行宏编程。以您自己的扩展为基础实现 Lotus Symphony 文档非常简单:
- 打开宏编辑器,然后编写代码。
- 添加控件到 Lotus Symphony 文档。
- 关联宏和控件中的事件。
在本文中,我们讲解的这些步骤都针对一个简单的程序。然后,我们通过一个更实际的示例说明如何使用 Universal Network Objects(UNO)组件模型查询 Lotus Symphony 电子表格中的数据。
创建宏
Lotus Symphony 中的宏存放在模块中。库是用来组织模块的,可以依附于一个文档或者模板。在第一个示例中,首先创建一个文档,然后,针对该文档将一个新的模块添加到标准库中。您可以使用宏编辑器编辑模块内容,添加简单的程序代码,然后使用宏保存新的模块。
打开宏编辑器
打开 Lotus Symphony,然后执行以下步骤:
- 选择 File - New - Spreadsheet。(尽管这里的示例使用的是电子表格,但其他类型的 OpenDocument 也适用。)
- 打开电子表格后,选择 Tools - Macro - Macro,显示宏对话框。参见图 1。
- 在左边的导航器中,选择 Untitled 文档(保存文档时名字会改变)下的 Standard 库。
- 单击 New 按钮,然后单击 OK 按钮接受默认的模块名(Module1)。
图 1. 在新模块中打开宏编辑器
现在,宏编辑器显示出来了,如图 2 所示。
图 2. 宏编辑器
对于第一个宏,您需要删除模板,将您自己的过程(SUB)添加到编辑器的内容中。执行以下步骤:
- 选择 REM(remark)语句下方的所有文本,然后删除它们。
- 在编辑器中添加以下代码:br/>
Sub HelloWorld
MsgBox "Hello World"
End Sub
- 单击图 3 中显示的 Complile 按钮,然后,单击图 4 中显示的 Run 按钮。将会显示一个简单的文字消息 Hello World,如图 5 所示。
图 3. 编译
图 4. 运行
图 5. 结果
单击 OK 按钮,清除消息。
保存工作
 |
宏安全级别
从不:禁用所有的文档宏,除非宏进入了宏编辑器或者手动加载。
根据路径列表:仅从指定路径的文档中运行 R 文档宏。
安全模式:根据分配的事件运行文档宏,但是包含了被禁止的 UNO APIs 和 StarBasic 运行时方法的非安全 API 除外。
总是:不管来源是什么,总是运行所有的文档宏。
|
|
既然宏可以运行了,保存 Lotus Symphony 文档是不错的主意;保存文档的同时也自动保存了宏。选择 File - Save As,然后在窗口中输入一个名字,文件类型为默认设置。随后的屏幕捕获是以名字 Hello.ods 为基础。
支持从文档中执行宏
开始关联控件和新的宏之前,先检查和更新 Lotus Symphony 首选项,以允许执行存放在文档中的宏。为了提高安全性,默认设置在默认的情况下禁用了已加载文档中的宏,但是,您需要从被保存的文件中运行宏,因此,需要修改首选项设置。更多有关可用的安全级别的信息,请参见侧栏中的 “宏安全级别”。
按照这些步骤操作:
- 选择 File - Preferences,然后单击 IBM Lotus Symphony 旁边的加号按钮和 Macro Security 条目。
- 修改 Run Macros:将条目列为 Always,然后选择 Show warning before running 选项,如图 6 所示:
图 6. 启用宏
- 单击 Ok 按钮以更新 Lotus Symphony 首选项。
如果后面打开这个文档,将会提示允许运行保存在文档中的宏。
为文档添加控件
既然宏可以运行了,下一步就是添加一个控件到文档中。在这一步,切换到文档设计模式,添加一个控件,然后为控件设置属性。
切换到设计模式
第一步是启用 Form Functions 工具栏,显示图标以帮助将控件添加到文档中。
按照这些步骤操作:
- 选择 View - Toolbar,然后选择 Form Functions 工具栏条目(如果还没有选择的话)。
- 单击工具栏中的 Design Mode On 图标。请参见图 7。
图 7. 打开设计模式
对于简单的示例,使用一个按钮控件。选择 Push Button 图标,然后将鼠标指针移到文档中,并把控件拖到文档中。不要过于担心尺寸和位置,因为后面可以使用控件中的定位手柄对它们进行修改。请参见图 8。
图 8. 添加的 Push Button 控件
修改控件
您可以根据以下步骤修改控件:
- 要修改按钮控件中的名字和鼠标置于其上方时显示的帮助提示,右键单击按钮控件,然后选择 Control。
- 停在 General 选项卡。在 Label 字段,将值 Button 改成 Say Hello,然后移动到底部字段,在 Help 文本字段中输入 Click here for a friendly greeting。请参见图 9。
图 9. 更新控件属性
- 关闭属性对话框。
注意,现在当鼠标置于按钮控件上方时,将会显示添加到 Help 文本中的文字。现在是时候将您前面创建的宏和这个控件关联起来了。
关联宏和控件的事件。
要关联一个宏和控件的一个事件,请按照这些步骤操作:
- 在设计模式中,右键单击按钮控件,然后选择 Control。
- 选择 Events 选项卡。单击 Mouse button pressed 字段右侧的按钮,显示 Assign Macro 对话框。
- 在导航框的左下方,展开 Hello BASIC Macros 列表,然后展开 Standard library 列表。
- 选择 Module1 模块后,将自动选择新的宏,如图 10 所示。
图 10. 为控件分配宏
- 单击 Assign 按钮。注意现在事件是如何与库和模块中的宏关联的。
- 单击 OK 按钮,关闭 Assign Macro 对话框。
测试控件
现在只需要对按钮控件进行定位或者修改尺寸(按照您的意愿),然后关闭设计模式以测试控件。完成修改或者移动按钮后,再次单击 Design Mode On 图标关闭设计模式。请参见图 11。
图 11. 关闭设计模式
切换了图标后,注意 Form Function 工具栏中的大部分图标都被禁用了,只剩 Select 和 Design Mode On 图标可用。关闭设计模式时,单击按钮控件。单击按钮控件后,将会显示一个消息,如图 12 所示。
图 12. Hello World
您已经掌握了基础技能,因此,让我们看看一个实际示例,结合一个 push 按钮控件和一个更为复杂的宏。
付诸实践
这个更详细的示例处理这样一种情况:Lotus Symphony 电子表格用来跟踪一组项目。您要为每个项目分配一个惟一的且随机的、四位数的项目识别码。添加一个新的项目后,项目经理可以单击电子表格中的一个按钮以获取项目识别码。看看为了完成这个任务您所需要添加到宏的一些代码。
生成随机数字
在这种情况下,您的宏需要创建四位数的数字代码,代码值的范围从 0000 到 9999。要在这个范围内获取一个值,把 Rnd() 函数的结果乘以 10000,并且去掉小数点后面的所有值。调用 Rnd() 前,必须先调用 Randomize 过程以初始化随机数字生成器。由于这个结果保存在一个整数变量中,因此,显示值的消息应该使用一个格式化代码,为代码填充具有前导零的四个字符。该代码数量不到 1000 个。清单 1 显示整个运行过程。
清单 1. 用来生成和显示四位数的数字代码的宏
Sub myRandom
Dim iCode as Integer
Randomize
iCode = Int((10000* Rnd)) REM value between 0000-9999
MsgBox Format(iCode,"0000"),0,"Random Code"
End Sub
|
如果不需要考虑将相同代码分配到多个项目的情况,这个宏就足以满足您的需求。
找出惟一的代码值
用这个工具跟踪的项目总数不多,可能不到 100 个。您用来找出一个惟一代码的方法是仔细检查当前的电子表格数据,看看是否有任何其他的项目代码能够匹配新的备选代码。只要潜在的随机代码数比要查找的记录的数目大,这个简单的方法就是有效的。
要在一个宏中进行这种电子表格数据处理,您需要使用一小部分的 Universal Network Objects(UNO)API。Lotus Symphony API 是以 UNO 为基础,而 UNO 是 OpenOffice.org 的组件模型。面向 UNO 的许多语言绑定(包括 BASIC)都可使用。尽管这个听起来有点复杂,但是,这个组件模型能够轻易地被用于获取您的电子表格的单元格值。
按照这些步骤进行操作:
- 使用 getSheets.getByIndex 方法获得一个与当前工作表关联的对象。
- 使用 getCellByPosition 方法为一个单元格对象查询工作表对象,这会获取一个列和行值。
- 使用 value 方法查询单元格对象,以获得单元格的数字内容。
UNO 组件模型的获取在清单 2 的最终宏代码中以粗体字显示。
清单 2. 生成一个惟一的四位数的数字代码的宏
Sub randomCode
Dim iCode as Integer
Dim oSheet as Object
Dim oCell as Object
Dim bMatch as Boolean
oSheet = thisComponent.getSheets.getByIndex( 0 )
bMatch = True
Randomize
Do While bMatch = True
iCode = Int((10000* Rnd)) REM value between 0000-9999
bMatch = False
For iCount = 0 To 499
oCell = oSheet.getCellByPosition( 0, iCount )
If ( oCell.value = iCode ) Then
bMatch = True
End If
Next
Loop
MsgBox Format(iCode,"0000"),0,"Random Code"
End Sub
|
这个宏使用一个 For ... Next 循环,扫描 Lotus Symphony 电子表格的第一个工作表的前面 500 行,并且在第一列中查找可能的匹配。Boolean 变量 bMatch 用来跟踪扫描的状态。如果找到一个匹配值,Do While ... Loop 使用一个新生成的随机码重复这个循环,直到行扫描不再生成匹配值。
图 13 所示的电子表格包含一些项目行和宏输出。
图 13. 应用中的宏
正如消息框一样,电子表格的第一列已经使用了格式化代码 0000 进行了自定义,确保即使分配的数字位数很少,也能显示四位数的代码。
尽管这个示例使用一个消息来为使用跟踪电子表格的项目经理提供随机代码,一个简单的改进就是在当前的文档中使用 UNO getCurrentSelection 方法,找出一个位置来放置惟一的代码,而不是让项目经理从消息中复制它。
结束语
现在您已经学习了使用 OpenOffice.org BASIC 语言进行 Lotus Symphony 宏编程的基础知识。在这个过程中,您学习了如何创建和组织宏、如何在文档中执行宏,以及如何关联控件中的事件和宏。您可以通过访问参考资料部分的链接,获取更多关于这些内容和相关话题的信息。
感谢
作者要感谢 Paul Bastide 审阅本文。他是 IBM Lotus Symphony 的一名 IT 专家。
参考资料 学习
获得产品和技术
讨论
关于作者  | |  | Tim Robinson 是一名高级软件工程师,他效力于位于加州 San Mateo 的 IBM Innovation Center 团队。在该团队中,他为网络安全、开放系统和动态基础设施提供了洞察力和战略。由于不再满足于将普通的生产力应用程序迁移到 IBM Lotus Symphony,他准备充分利用这个创新的平台。 |
对本文的评价
|