前两天遇到一个问题:在当前编辑文档上,点击按钮,从其他文档中获取内容,替换到当前文档的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