lotusscript开发者论坛

lotusscript开发者论坛

利用 LotusScript 灵活操作 Lotus Notes 富文本域

 
简介: 本文介绍了如何利用 LotusScript. 来灵活操作 Lotus Notes 富文本域(Rich Text Field)里的内容,并提供了几个示例程序来进行展示。要求读者有 LotusScript. 编程经验并能熟练使用 Lotus Domino Designer。
 
 

引言

一直以来,Lotus Notes 的富文本域都是使用非常频繁的,几乎在任何 Domino 应用程序中,都会用到富文本域。Lotus Notes 富文本域的功能也非常强大,除了支持普通的文本以外,还支持图片、表格、嵌入对象、Http 链接、Notes 链接、附件等等众多的类型。但是有个问题一直长期困扰着 LotusScript. 开发人员,那就是对 Notes 富文本域里面的各种类型的内容的灵活操作很困难,其实 Domino 在不断升级的过程中,已经增加了许多新的 LotusScript. 类来操作 Notes 富文本域了,但是很多 LotusScript. 开发人员对此并不熟悉。本文将介绍如何使用这些类来灵活操作富文本域。

操作 Notes 富文本域相关的 LotusScript. 类

和操作 Notes 富文本域相关的 LotusScript. 类包括:

  • NotesRichTextNavigator 富文本域的导航器,用来访问富文本域中的各种元素;
  • NotesRichTextRange 表示富文本域内容的一个范围,可以包括多个元素;
  • NotesRichTextDocLink 表示富文本域内容的文档链接;
  • NotesEmbeddedObject 表示嵌入式对象或者文件附件;
  • NotesRichTextSection 表示富文本域中的一个区段;
  • NotesRichTextTable 表示富文本域中的表格;
  • NotesRichTextStyle. 表示富文本的各种属性;
  • NotesRichTextParagraphStyle. 表示富文本段落的各种属性;
  • NotesColorObject 表示一种颜色。

使用示例

下面我们通过一个程序来分析各个类的使用方法。

首先我们建立一个空白的 Domino 应用程序,然后建立一个名为“test”的表单,这个表单中只有一个名为“Body”的富文本域,然后在缺省视图里面建立一个 Action 名为“test”,代码如下。这段程序将生成一个文档,文档中包含一个富文本域,并在富文本域中生成各种元素。


清单 1. 生成各种元素
Sub Click(Source As Button)
    Dim s As New NotesSession
    Dim db As NotesDatabase
    Dim doc As NotesDocument
    Set db  =  s.CurrentDatabase
    Set doc = New NotesDocument(db)
    doc.Form. = "test"
    Dim rtf As NotesRichTextItem 
    Set rtf = doc.CreateRichTextItem ("Body")
    
    '生成一个文本段落并设置其字体大小,颜色等属性
    Dim style. As NotesRichTextStyle. Set style. = s.CreateRichTextStyle. Dim pstyle. As NotesRichTextParagraphStyle. Set pstyle. = s.CreateRichTextParagraphStyle. Dim color As NotesColorObject
    Set color  = s.CreateColorObject
    style.FontSize = 20
    style.Bold = True
    pstyle.Alignment = ALIGN_LEFT
    pstyle.FirstLineLeftMargin = RULER_ONE_INCH
    Call color.SetRGB(123, 234, 123) 
    style.NotesColor = color.NotesColor
    Call rtf.AppendStyle(style)
    Call rtf.AppendParagraphStyle(pstyle)
    Call rtf.AppendText("这是一个文本段落,靠左对齐。")
    Call rtf.AddNewline(1)
    
    '生成一个数据库链接,链接到当前数据库
    Call rtf.AppendDocLink(db, "链接到当前数据库", "当前数据库")
    
    '生成一个包含一个表格的区段
    Call rtf.AppendStyle(style)
    Call rtf.BeginSection("这是一个区段", style, color, True)
    Call rtf.AppendText("这是区段的开始")
    iRow% = 3
    iCol% = 3
    style.NotesColor = COLOR_BLUE
    Call rtf.AppendStyle(style)
    '添加一个3X3的表格
    Call rtf.AppendTable(iRow%, iCol%)    
    Call rtf.AppendText("这是区段的结束")
    Call rtf.EndSection
    Dim nav As NotesRichTextNavigator
    Set nav = rtf.CreateNavigator
    Call nav.FindFirstElement(RTELEM_TYPE_TABLECELL) 
    style.FontSize=16
    style.Bold=False
    Call rtf.AppendStyle(style)
    For i% = 1 To iRow%
        For j% = 1 To iCol%
            Call rtf.BeginInsert(nav)
            Call rtf.AppendText("行 " & i% & ", 列 " & j%)
            Call rtf.EndInsert
            Call nav.FindNextElement(RTELEM_TYPE_TABLECELL)
        Next
    Next
    
    '添加一个附件
    Call rtf.EmbedObject(EMBED_ATTACHMENT, "", "C:\Documents and Settings\All Users\
        Documents\My Pictures\Sample Pictures\Water lilies.jpg")
    
    Call doc.Save(True,True)
End Sub

下面的图片是运行这个程序后生成的文档截图:


图 1. 程序生成文档图
图 1. 程序生成文档图

下面将分析一下这个程序中使用的一些方法。

  • NotesSession.CreateRichTextStyle:创建一个 NotesRichTextStyle. 对象。
  • NotesSession.CreateRichTextParagraphStyle:创建一个 NotesRichTextParagraphStyle. 对象。
  • NotesSession.CreateColorObject:创建一个 NotesColorObject 对象。

    需要注意的是 NotesRichTextStyle,NotesRichTextParagraphStyle. 和 NotesColorObject 这三种对象是不能用 New 来创建的,因为这三个类没有 New() 方法,只能通过 NotesSession 来创建。

  • NotesRichTextItem.AppendStyle:在当前位置插入一个格式对象,该位置以后的格式都使用这种格式,直到插入了另外一个格式。
  • NotesRichTextItem.AppendParagraphStyle:在当前位置插入一个段落格式对象,该位置以后的段落格式都使用这种格式,直到插入了另外一个段落格式。
  • NotesRichTextItem.BeginSection:在富文本域中插入一个区段。
  • NotesRichTextItem.EndSection:区段结束,必须和 BeginSection 配对使用。

    在两个方法之间可以通过各种 append 方法添加各种元素。插入区段的时候,区段总是在富文本域的最后。还需要注意的是不能创建一个包含富文本域中已有的元素的区段,通过 BeginSection 方法创建的区段总是空的,区段的内容需要通过程序自己添加。

  • NotesRichTextItem.CreateNavigator:创建一个富文本域导航器对象 NotesRichTextNavigator。

    创建一个富文本域导航器只能使用这种方法,NotesRichTextNavigator 也没有 new 方法。也可以 NotesRichTextRange.Navigator 属性来得到一个 NotesRichTextNavigator 对象。

  • NotesRichTextNavigator 类是用来灵活访问操作富文本域里的内容的最重要的一个类,通过它的一些方法,可以方便的访问到各种富文本域中的元素。

    导航器对象 NotesRichTextNavigator 会维护一个当前位置,任何在富文本域中的 get 或者 find 的操作都可能会改变这个当前位置。导航总发生在同一种类型的元素中,主要通过 find 和 get 两类方法来访问相应的元素,找到需要的元素后,再通过 get 方法来取得这个元素。下表列出了这些方法。


表 1. 方法列表
方法名 描述
FindFirstElement 将当前位置移动到指定类型的第一个元素
FindNextElement 将当前位置移动到指定类型的下一个元素
FindLastElement 将当前位置移动到指定类型的最后一个元素
FindNthElement 将当前位置移动到指定类型的第 n 个元素
FindFirstString 将当前位置移动到第一个指定字符串的开头
FindNextString 将当前位置移动到下一个指定字符串的开头
GetElement 返回当前位置的元素
GetFirstElement 返回第一个指定类型的元素
GetLastElement 返回最后一个指定类型的元素
GetNextElement 返回下一个指定类型的元素
GetNthElement 返回第 n 个指定类型的元素

NotesRichTextItem.BeginInsert:将插入位置从富文本域结尾处改为指定元素的开始或者结尾处。

NotesRichTextItem.EndInsert:将插入位置重置到富文本域的结尾处,需要和 BeginInsert 配对使用。

在两个方法之间可以通过各种 append 方法添加各种元素。我们来看看 BeginInsert 的具体使用方法:

Call notesRichTextItem.BeginInsert( element, [ after ] )

参数说明

element:可以是 NotesEmbeddedObject, NotesRichTextDocLink, NotesRichTextNavigator, NotesRichTextRange, NotesRichTextSection, 或者 NotesRichTextTable,表示该对象的位置 . 如果是 NotesRichTextNavigator 则表示此 NotesRichTextNavigator 对象所表示的当前位置。

After:布尔型可选参数,True 表示插入位置在元素的末尾,False(缺省值)表示插入位置在元素的开头。

通过上面的简单的例子,我们可以看到如何利用 LotusScript. 来操作富文本域,下面我们通过另外一个例子来展示如何利用 LotusScript. 来实现一个简单的类似 Word 中将一段文本和表格互相转换的功能,主要展示的是如何利用 NotesRichTextRange 类来操作富文本域中的文本段落。

首先建一个表单 test,表单中创建一个 Body 的富文本域,然后创建一个表单操作名为 Text2Table,完成将文本转化为表格的功能。代码如下:


清单 2 将文本转化为表格
Sub Click(Source As Button)
    Dim s As New NotesSession
    Dim ws As New NotesUIWorkspace
    Dim uidoc As NotesUIDocument
    Set uidoc = ws.CurrentDocument
    Dim doc As NotesDocument
    Set doc = uidoc.Document
    Dim rtf As NotesRichTextItem
    Set rtf = doc.GetFirstItem("Body")
    '设定分隔符为空格
    delimiter$ =  " "
    rowcount% = 0
    colcount% =  0
    Dim rtnav As NotesRichTextNavigator
    Set rtnav = rtf.CreateNavigator
    Dim rtrange As NotesRichTextRange
    Dim rows() 
    Dim paraArray As Variant
    Dim paraStr As String
    Dim firstTime As Boolean
    firstTime = True
    
    If rtnav.FindFirstElement(RTELEM_TYPE_TABLECELL) Then
        Msgbox "表格已经存在!"
        Exit Sub
    End If
    If rtnav.FindFirstElement(RTELEM_TYPE_TEXTPARAGRAPH) Then
        Set rtrange = rtf.CreateRange
        Do
            '设置文本范围的开始为rtnav所指向的位置
            Call rtrange.SetBegin(rtnav)
            '取得该位置的文本段落
            paraStr = rtrange.TextParagraph
            paraArray = Split(paraStr)
            '通过firstTime来判断文本段落的格式是否能转化为表格
            If firstTime Then
                colcount% = Ubound(paraArray)
                firstTime = False
            Else
                If colcount% <> Ubound(paraArray) Then
                    Msgbox "文本无法转化为表格!"
                    Exit Sub
                End If
            End If
            '定义动态数组来保存所有的文本段落
            Redim Preserve rows(rowcount%)
            rows(rowcount%) = paraArray
            rowcount% = rowcount% + 1
        Loop While rtnav.FindNextElement(RTELEM_TYPE_TEXTPARAGRAPH)
    Else
        Messagebox "富文本域中没有文本"
        Exit Sub
    End If
    '将富文本域值清空
    rtf.Values = ""
    rowcount% = rowcount% - 1
    '插入表格,并将保存的文本依次插入相应的表格单元
    Dim row As Variant
    Call rtf.AppendTable(rowcount%+1, colcount%+1)
    Call rtnav.FindFirstElement(RTELEM_TYPE_TABLECELL)
    For i% = 0 To rowcount%
        row = rows(i%)
        For j% = 0 To colcount%
            Call rtf.BeginInsert(rtnav)
            Call rtf.AppendText(row(j%))
            Call rtf.EndInsert
            Call rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)
        Next
    Next
    '保存文档并重新打开以刷新
    Call doc.Save(True, True)
    Call uidoc.Close(True)
    Call ws.EditDocument(False,doc)
    
End Sub

再建立一个表单操作名为 Table2Text,完成将表格转化为文本的功能。代码如下:


清单 3 将表格转化为文本
Sub Click(Source As Button)
    Dim s As New NotesSession
    Dim ws As New NotesUIWorkspace
    Dim uidoc As NotesUIDocument
    Set uidoc = ws.CurrentDocument
    Dim doc As NotesDocument
    Set doc = uidoc.Document
    Dim rtf As NotesRichTextItem
    Set rtf = doc.GetFirstItem("Body")
    
    delimiter$ =  " "
    Dim rtnav As NotesRichTextNavigator
    Set rtnav = rtf.CreateNavigator
    Dim rtrange As NotesRichTextRange
    Set rtrange = rtf.CreateRange
    Dim tbl As NotesRichTextTable
    Dim rowcount As Integer
    Dim colcount As Integer
    
    If rtnav.FindFirstElement(RTELEM_TYPE_TABLE) Then
        Set tbl = rtnav.GetElement
        rowcount = tbl.RowCount - 1
        colcount = tbl.ColumnCount - 1
        Redim data(rowcount, colcount)
        For i% = 0 To rowcount
            For j% = 0 To colcount
                Call rtnav.FindNextElement(RTELEM_TYPE_TABLECELL)
                Call rtrange.SetBegin(rtnav)
                If j% = colcount Then
                    Call rtf.AppendText(rtrange.TextParagraph )
                Else
                    Call rtf.AppendText(rtrange.TextParagraph & delimiter$)
                End If
            Next
            If i% < rowcount Then
                '生成新的段落
                Call rtf.AddNewline(1)
            End If
        Next
    Else
        Messagebox "富文本域中没有表格"
        Exit Sub
    End If
    
    Call tbl.Remove
    Call doc.Save(True, True)
    Call uidoc.Close(True)
    Call ws.EditDocument(False,doc)    
End Sub

运行结果如下图:


图 2. 文本格式
图 2. 文本格式

图 3. 表格格式
图 3. 表格格式 

总结

通过以上本文的介绍和示例及代码分析,相信读者对如何操作 Notes 富文本域已经有了了解,我们可以看到 LotusScript. 的强大功能,通过灵活运用适当的类,可以完成很多我们认为不能完成的功能,希望本文对读者有所启发和帮助。

阅读更多
个人分类: lotusscript
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭