1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

Умирает notesdocument

Тема в разделе "Lotus - Программирование", создана пользователем Cheburan, 23 май 2016.

  1. Cheburan

    Cheburan Member

    Репутация:
    0
    Регистрация:
    23 фев 2015
    Сообщения:
    17
    Симпатии:
    0
    Здравствуйте.
    Гибнет NotesDocument, примерно в вот таком случае:
    есть библиотека
    Код:
    'Script Library 'TEST'
    Option Public
    Option Declare
     
    Use "GetDatabase"
     
    Sub testDbObj( param List As Variant )
    	Dim db As NotesDatabase
    	Dim doc As NotesDocument
     
    	Set db = getSomeDb()
    	Set doc = db.Getdocumentbyunid( "6F51A2A353115418C2257F6A0035127A" )
    	MsgBox "testDbObj " & (doc Is nothing)
    	Set param("123") = doc
    End Sub
    и кнопка на форме
    Код:
    Sub Click(Source As Button)
    	Dim param List As Variant
    	Dim var As Variant
     
    	Redim var(0)
    	var(0) = "123"
    	param("123") = var
    	Call testDbObj( param )
    	Msgbox "Click " & (param("123") Is Nothing)
    End Sub
    Функция getSomeDb из SL GetDatabase возвращает NotesDatabase - берет из представления документ с настройками о том где лежит база и создает объект.

    При нажатии получаем следующие сообщения:
    testDbObj False
    Click True

    Таким образом NotesDocument умер. Бывают и другие примеры подобного поведения. Кто-то сталкивался с таким? Как лечить, или может где-то описана причина такого поведения?
     
  2. savl

    savl Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    2.116
    Симпатии:
    157
    @Cheburan,
    Dim db As NotesDatabase заменить на Static db As NotesDatabase
    У Вас объект базы уничтожается при выходе из функции testDbObj.
     
  3. Cheburan

    Cheburan Member

    Репутация:
    0
    Регистрация:
    23 фев 2015
    Сообщения:
    17
    Симпатии:
    0
    Спасибо. А если это метод класса? Т.е. если сам метод модификации списка принадлежит классу и получение NotesDatabase происходит через вызов функции класса?
     
    #3 Cheburan, 23 май 2016
    Последнее редактирование модератором: 23 май 2016
  4. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Репутация:
    0
    Регистрация:
    6 ноя 2007
    Сообщения:
    3.195
    Симпатии:
    24
    или обьявить базу в глобале, чтобы она не уничтожалась
     
  5. lmike

    lmike нет, пердело совершенство
    Lotus team

    Репутация:
    3
    Регистрация:
    27 авг 2008
    Сообщения:
    6.406
    Симпатии:
    346
    время жизни объекта БД д.б. больше времени жизни объектов из него полученных
    я, обычно, объявляю Private db As NotesDatabase
    и в конструкторе инициализирую
    --- Добавлено 23 май 2016. Первое сообщение размещено 23 май 2016 ---
    это еще один гвоздь в гроб подхода процедурного стиля кодирования
    там где легаси - придется затыкать через Static или глобальную в либе
    и да, при глобальной db она д.б. Public иначе теже грабли
     
  6. VladSh

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

    Репутация:
    0
    Регистрация:
    11 дек 2009
    Сообщения:
    1.248
    Симпатии:
    2
    Лучше глобальная private-переменная - список БД. В таком случае переменная и public-функция получения БД одни для всего остального кода базы.
     
  7. lmike

    lmike нет, пердело совершенство
    Lotus team

    Репутация:
    3
    Регистрация:
    27 авг 2008
    Сообщения:
    6.406
    Симпатии:
    346
    так и до класса не далече ;)
     
  8. rinsk

    rinsk Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    12 ноя 2009
    Сообщения:
    895
    Симпатии:
    84
    чур я - за класс! :)
    стараюсь где можно избавится от явного получения set db= и юзаю конструкцию из 2-х классов -
    первый типа public DataModelClassBase -
    Базовый класс представляет собой контейнер, который возвращает все необходимые базы
    'и представления приложения. и второй - Public Class DataModelMH As DataModelClassBase
    пользовательские ф-ции и в этой же библе обьявляется public переменная Public MH As DataModelMH
     
  9. oshmianski

    oshmianski Достойный программист
    Lotus team

    Репутация:
    0
    Регистрация:
    25 апр 2012
    Сообщения:
    545
    Симпатии:
    13
    так а без них никуда.
    у меня статические DbManager и ViewManager с кешем внутри.
     
Загрузка...
Похожие Темы - Умирает notesdocument
  1. Zeka
    Ответов:
    1
    Просмотров:
    5.004
  2. imendan
    Ответов:
    12
    Просмотров:
    545
  3. imendan
    Ответов:
    4
    Просмотров:
    1.248
  4. Serduko
    Ответов:
    18
    Просмотров:
    2.512
  5. Serduko
    Ответов:
    11
    Просмотров:
    2.731

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