天天看點

文檔編輯狀态更新RTF域

前兩天遇到一個問題:在目前編輯文檔上,點選按鈕,從其他文檔中擷取内容,替換到目前文檔的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