前兩天遇到一個問題:在目前編輯文檔上,點選按鈕,從其他文檔中擷取内容,替換到目前文檔的RTF域中,并設定字型、大小等屬性。 很快将代碼寫出來,一運作才發現,忘記RTF在編輯狀态重新整理是需要“儲存”-“關閉”再“打開”這三個動作的。 Call doc.save(True,True) Call uidoc.Close(True) Set uidoc = ws.editdocument(True,doc) 但是又出現兩個問題,(1)我已經調用了背景(back end)doc對象的save方法了,在關閉文檔時,還是彈出一個提示,問我是否儲存目前文檔。并且(2)重新打開文檔後,RTF的字型樣式沒有變化。 問題(1)我想notes文檔編輯狀态下,對文檔的背景對象儲存後,一般調用uidoc的refresh等方法就可以了,但是RTF域不行,可能是基于效率的原因,是以不會像一般域那樣即時重新整理。隻有關閉再打開才能重新整理。 如果關閉時提示要儲存,說明notes發現我對文檔做過修改(我想應該是通過某種比較判斷得出的),但我在背景做的修改,并且也調用save寫到資料庫中了,怎麼還是提示我要儲存。改成uidoc.save也是一樣。這個提示對我的功能影響很大,如果使用者選擇儲存,我的背景處理會被目前文檔内容替換回去。是以必須想辦法去掉這個提示。 幾乎快要放棄的時候,偶然注意到,在目前文檔關閉前,notes提示儲存時,目前文檔因為已經執行ws.editdocument()方法在另一個視窗中悄悄打開了,并且它的RTF域的内容是以我的處理結果表現的。這給了我一個啟示。 我的背景處理是正确的,隻要notes不彈出提示,我的處理就完成。雖然我是在編輯狀态下點選按鈕啟動功能的,但我的處理都是背景的,不一定非要在編輯狀态下進行,我可以把文檔狀态切換到讀狀态後再開始背景處理,這樣就避免了在處理結束、文檔關閉時才提示文檔未儲存。通過實踐證明我是對的。 其實就是把文檔編輯的影響,從RTF域背景進行中剝離出去。
從 uidoc.editmode 的true 到false 的切換可以判斷目前文檔是否已經被修改。問題(2)剛開始我直接設定doc.body=””這樣來清空原來的值,但有出現兩個問題,一就是設定的字型沒變化,二是當第二次操作時,body域的域類型變成了文本域,在Set rtitem = doc.GetFirstItem("body")這一句會出現類型不比對的錯誤。我不明白doc.body=””這樣一個操作會使notes把一個RTF域變成文本域。為了證明NotesRichTextStyle對象是有用的,我試着用script建立一個包含RTF域的新文檔,用NotesRichTextStyle對象設定RTF域值,結果是成功的。
這不僅說明 NotesRichTextStyle 對象是有用的,也說明RTF 的文本樣式設定對新的RTF 域才有效。(?不太肯定是這樣)。于是把清空body内容的代碼改為如下: '清空目前域内容 Set rtitem = doc.GetFirstItem("body") rtitem.remove Set rtitem = doc.CreateRichTextItem("body") 這樣,之後的文本設定就正确了。 完整源代碼如下: Sub Click(Source As Button) Dim ws As New NotesUIWorkspace Dim s As New NotesSession Dim uidoc As notesuidocument Dim doc As notesdocument Dim rtitem As notesrichtextitem Dim richStyle As NotesRichTextStyle Set uidoc = ws.CurrentDocument Call uidoc.save uidoc.editmode=False ‘關鍵是這裡 Set doc = uidoc.Document '清空目前域内容 Set rtitem = doc.GetFirstItem("body") rtitem.remove ‘關鍵是這裡 Set rtitem = doc.CreateRichTextItem("body") Set richStyle = s.CreateRichTextStyle '增加标題 richStyle.NotesFont = FONT_COURIER richStyle.Bold = True richStyle.FontSize = 26 richStyle.Italic=True Call rtitem.AppendStyle(richStyle) Call rtitem.appendtext("Titleeeeeeeeeeee") Call rtitem.AddNewline(1) '增加内容 richStyle.Bold = False richStyle.FontSize = 9 Call rtitem.AppendStyle(richStyle) Call rtitem.appendtext("contents") Call rtitem.AddNewline(1) '增加兩個換行,和下一Outline分隔開 Call rtitem.AddNewline(2) Call doc.save(True,True) Call uidoc.Close(True) Set uidoc = ws.editdocument(True,doc) End Sub