Обновление RichTextField переоткрытием документа

  • Автор темы morpheus
  • Дата начала
M

morpheus

Задача
Часто необходимо отразить изменения в открытом пользователем документе. Т.к. работа лотуса с рт-полями спецефична, UI документ необходимо переоткрывать.

Решение
Код:
'тут что-то пишется в RichTextItem

' "прописываем" изменения в RichTextItem
Call RichTextItem.Update

' тут указывается форма документа, если он был новый и форма не установлена еще, либо на всякий случай :)
Call uidoc.Document.ReplaceItemValue("Form", "СЮДА НАДО ВПИСАТЬ ИМЯ ФОРМЫ, А ЛУЧШЕ АЛИАС")

' теперь открываем документ в новом окне
Call ws.EditDocument(True, uidoc.Document)

' это позволяет избавиться от вопроса о сохранении закрываемого документа!
' причем это прописывается в "старый" экземпляр документа в памяти-instance,
' т.е. в открытом предыдущей командой документе это не появится и убирать не нужно оттуда ничего
Call uidoc.Document.ReplaceItemValue("SaveOptions", "0")

' закрываем "старый" документ
Call uidoc.Close(True)

Автор
link removed

Обсуждение
 
N

nvyush

Здесь Пишу базу TIA предлагал для обновления РТ полей без сохранения использовать не NotesRichTextItem.Update, а "магическое копирование" рт-поля. Поэкспериментировав с "магическим копированием" обнаружил, что оно, в отличие от Update, обновляет ВСЕ рт-поля документа. По мотивам написал функцию, которая обновляет все рт-поля и переоткрывает документ без сохранения на диск.
Код:
Public Sub RefreshRT(pUIDoc As NotesUIDocument)
Dim doc As NotesDocument
Set doc = pUIDoc.Document
Dim rti As New NotesRichTextItem(doc, doc.UniversalID)
Call rti.CopyItemToDocument(doc, doc.UniversalID & "_")
Call rti.Remove()
Call doc.RemoveItem(doc.UniversalID & "_")
Dim ws As New NotesUIWorkspace
Call ws.EditDocument(True, doc)	
Call doc.ReplaceItemValue("SaveOptions", "0")
Call pUIDoc.Close()
End Sub
Замечание модератора (OKEN): тут тоже надо указывать форму документа, если он был новый и форма не установлена еще (либо на всякий случай)
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
233
Я юзаю в таком варианте:
Код:
Const IN_SAVEOPTIONS = "SaveOptions"

Function RefreshRT(EditMode As Boolean, nuid As NotesUIDocument) As NotesUIDocument
    'Если док создавался с помощью Compose, то НА ФОРМЕ ПЕРЕОТКРЫВАЕМОГО ДОКУМЕНТА Д.Б. ПОЛЕ Form!!!
    'методом Compose или соотв. формулой создаю только простые документы, типа справочников, чего и всем желаю
    Dim nuiws As New NotesUIWorkSpace
 
    If nuid.ModifiedSinceSaved Or nuid.Document.GetItemValue(IN_SAVEOPTIONS)(0) = "1" Then
        Call nuid.Document.ReplaceItemValue(IN_SAVEOPTIONS, "0")
    End If
    Call nuid.Close()
 
    Set RefreshRT = nuiws.EditDocument(EditMode, nuid.Document)
    If (Not RefreshRT Is Nothing) And EditMode Then
        RefreshRT.Document.ReplaceItemValue(IN_SAVEOPTIONS, "1").SaveToDisk = False
    End If
End Function
 
D

Dennis

Я, наверное, немного не в теме.
А что если у NUID вызвать метод Refresh(true)?
 
H

hosm

>А что если у NUID вызвать метод Refresh(true)?
Этот вариант работает только в режиме редактирования.
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
233
А что если у NUID вызвать метод Refresh(true)?
Если в этот момент в документе прописано SaveOptions="1", то документ молча сохранится на диск (это старый косяк Лотуса).
Чтобы этого не было, пишем функцию-обёртку, в которой удаляем SaveOptions, а после вызова метода Refresh(True) восстанавливаем исходное значение.
Для обновления пользуемся только этой функцией-обёрткой.
Аналогичные функции-обёртки желательно написать для большинства основных методов для работы с UI, т.к. там может идти ещё обработка ошибок и др.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!