簡介: 本文介紹瞭如何利用 LotusScript 來靈活操作 Lotus Notes 富文本域(Rich Text Field)裏的內容,並提供了幾個示例程序來進行展示。要求讀者有 LotusScript 編程經驗並能熟練使用 Lotus Domino Designer。
本文的標籤: lotusscript, 應用開發
標記本文!
發佈日期: 2010 年 8 月 02 日
級別: 初級
訪問情況 : 3131 次瀏覽
評論: 0 ( | 添加評論 - 登錄)
平均分 (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. 程序生成文檔圖
下面將分析一下這個程序中使用的一些方法。
- 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. 文本格式
圖 3. 表格格式
回頁首
總結
通過以上本文的介紹和示例及代碼分析,相信讀者對如何操作 Notes 富文本域已經有了瞭解,我們可以看到 LotusScript 的強大功能,通過靈活運用適當的類,可以完成很多我們認爲不能完成的功能,希望本文對讀者有所啓發和幫助。
回頁首
下載
描述 |
名字 |
大小 |
下載方法 |
---|
本文樣例代碼 |
test.nsf |
1 MB |
HTTP |
關於下載方法的信息
參考資料
學習
討論