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

簡介: 本文介紹瞭如何利用 LotusScript 來靈活操作 Lotus Notes 富文本域(Rich Text Field)裏的內容,並提供了幾個示例程序來進行展示。要求讀者有 LotusScript 編程經驗並能熟練使用 Lotus Domino Designer。

本文的標籤:  lotusscript應用開發

 

標記本文!

 

發佈日期: 2010 年 8 月 02 日 
級別: 初級 
訪問情況 : 3131 次瀏覽 
評論: 0 (查看 | 添加評論 - 登錄)

平均分 4 星 共 12 個評分 平均分 (12個評分)
爲本文評分

 

 

引言

一直以來,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. 生成各種元素

<span style="color:#666666">				
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
</span>

 

下面的圖片是運行這個程序後生成的文檔截圖:


圖 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 將文本轉化爲表格

<span style="color:#666666">				
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
</span>

 

再建立一個表單操作名爲 Table2Text,完成將表格轉化爲文本的功能。代碼如下:


清單 3 將表格轉化爲文本

<span style="color:#666666">				
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
</span>

 

運行結果如下圖:


圖 2. 文本格式
圖 2. 文本格式 

圖 3. 表格格式
圖 3. 表格格式 


回頁首

總結

通過以上本文的介紹和示例及代碼分析,相信讀者對如何操作 Notes 富文本域已經有了瞭解,我們可以看到 LotusScript 的強大功能,通過靈活運用適當的類,可以完成很多我們認爲不能完成的功能,希望本文對讀者有所啓發和幫助。

 


回頁首

下載

描述 名字 大小 下載方法
本文樣例代碼 test.nsf 1 MB HTTP

關於下載方法的信息

 

參考資料

學習

討論

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章