Обновление Rtfield

Тема в разделе "Работа с интерфейсом пользователя", создана пользователем morpheus, 15 апр 2009.

  1. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Задача
    Часто необходимо отразить изменения в открытом пользователем документе. Т.к. работа лотуса с рт-полями спецефична, UI документ необходимо переоткрывать.

    Решение
    Код (Text):
    'тут что-то пишется в 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)
    Автор
    Akupaka

    Обсуждение
     
  2. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Здесь Пишу базу TIA предлагал для обновления РТ полей без сохранения использовать не NotesRichTextItem.Update, а "магическое копирование" рт-поля. Поэкспериментировав с "магическим копированием" обнаружил, что оно, в отличие от Update, обновляет ВСЕ рт-поля документа. По мотивам написал функцию, которая обновляет все рт-поля и переоткрывает документ без сохранения на диск.
    Код (Text):
    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): тут тоже надо указывать форму документа, если он был новый и форма не установлена еще (либо на всякий случай)
     
  3. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Я юзаю в таком варианте:
    Код (LotusScript):
    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
     
  4. Dennis

    Dennis New Member

    Регистрация:
    7 июл 2014
    Сообщения:
    2
    Симпатии:
    0
    Я, наверное, немного не в теме.
    А что если у NUID вызвать метод Refresh(true)?
     
  5. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    >А что если у NUID вызвать метод Refresh(true)?
    Этот вариант работает только в режиме редактирования.
     
  6. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Если в этот момент в документе прописано SaveOptions="1", то документ молча сохранится на диск (это старый косяк Лотуса).
    Чтобы этого не было, пишем функцию-обёртку, в которой удаляем SaveOptions, а после вызова метода Refresh(True) восстанавливаем исходное значение.
    Для обновления пользуемся только этой функцией-обёрткой.
    Аналогичные функции-обёртки желательно написать для большинства основных методов для работы с UI, т.к. там может идти ещё обработка ошибок и др.
     
Загрузка...

Поделиться этой страницей