Умирает notesdocument

23.02.2015
17
0
#1
Здравствуйте.
Гибнет 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 умер. Бывают и другие примеры подобного поведения. Кто-то сталкивался с таким? Как лечить, или может где-то описана причина такого поведения?
 

savl

Well-Known Member
Lotus team
28.10.2011
2 126
163
#2
@Cheburan,
Dim db As NotesDatabase заменить на Static db As NotesDatabase
У Вас объект базы уничтожается при выходе из функции testDbObj.
 
23.02.2015
17
0
#3
Спасибо. А если это метод класса? Т.е. если сам метод модификации списка принадлежит классу и получение NotesDatabase происходит через вызов функции класса?
 
Последнее редактирование модератором:

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 223
24
#4
или обьявить базу в глобале, чтобы она не уничтожалась
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 483
360
#5
Спасибо. А если это метод класса? Т.е. если сам метод модификации списка принадлежит классу и получение NotesDatabase происходит через вызов функции класса?
время жизни объекта БД д.б. больше времени жизни объектов из него полученных
я, обычно, объявляю Private db As NotesDatabase
и в конструкторе инициализирую
 
это еще один гвоздь в гроб подхода процедурного стиля кодирования
там где легаси - придется затыкать через Static или глобальную в либе
и да, при глобальной db она д.б. Public иначе теже грабли
 

VladSh

начинающий
Lotus team
11.12.2009
1 248
2
#6
Лучше глобальная private-переменная - список БД. В таком случае переменная и public-функция получения БД одни для всего остального кода базы.
 

rinsk

Well-Known Member
Lotus team
12.11.2009
896
84
#8
так и до класса не далече
чур я - за класс! :)
стараюсь где можно избавится от явного получения set db= и юзаю конструкцию из 2-х классов -
первый типа public DataModelClassBase -
Базовый класс представляет собой контейнер, который возвращает все необходимые базы
'и представления приложения. и второй - Public Class DataModelMH As DataModelClassBase
пользовательские ф-ции и в этой же библе обьявляется public переменная Public MH As DataModelMH