Ошибка инициализации объектных переменных

nvyush

Lotus team
22.04.2009
2 317
0
#1
Здравствуйте все!

Столкнулся с непонятным глюком. Есть форма, на ней внедренное представление. В QueryOpen представления инициализируется объектная переменная (конкретно очередь сообщений, как описывалось на соседней ветке). После перекомпиляции всех модулей при открытии формы вылетает ошибка, суть которой - объектная переменная = Nothing. Открываю вьюху, добавляю/убираю пробел, сохраняю - все работает. После перекомпиляции всех модулей - опять та же ошибка. Кто знает, где собака зарыта?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 569
263
#2
без кода - сложно угадывать....
речь идет об инвьюедите?
 

nvyush

Lotus team
22.04.2009
2 317
0
#3
без кода - сложно угадывать....
речь идет об инвьюедите?
Форма с внедренным представлением открывается в диалоге. В представлении определены события
Sub Queryopen(Source As Notesuiview, Continue As Variant)
Set MsgQueue = New NotesMessageQueue("QName")
MsgQueue.AutoClose = False
End Sub

Sub Onselect(Source As Notesuiview)
Dim Msg As String
If MsgQueue.Messages > 0 Then Msg = MsgQueue.Message 'очистка предыдущего сообщения <<< ругается здесь
MsgQueue.Message = Source.CaretNoteID
End Sub

После перекомпиляции всех модулей выдает ошибку "Variant does not contain an object" в третьей строке OnSelect. Если пересохраняю вью, все работает как часы.

P.S. Форма работает как @PickList, только дополнительно содержит кнопку добавления новых документов.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 569
263
#4
я уже упоминал - иногда UI ф-ции Нотуса и АПИ (именно UI) к ним глючат
и особенной "любовью" пользуются модальные окна
почему теряется объект я не знаю...
в кач. совета - создавайте его по- месту (а не на опен), ведь очередь без автоклозе будет жить
 

nvyush

Lotus team
22.04.2009
2 317
0
#5
я уже упоминал - иногда UI ф-ции Нотуса и АПИ (именно UI) к ним глючат
и особенной "любовью" пользуются модальные окна
почему теряется объект я не знаю...
в кач. совета - создавайте его по- месту (а не на опен), ведь очередь без автоклозе будет жить
Спасибо за совет - перенес все в OnSelect и глюк пропал. Кстати, а LS позволяте перегрузить New - создать второй конструктор, чтоб значение автоклоуза устанавливать сразу в конструкторе?
(+1).
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 569
263
#6
да - позволяет, но там и класс небольшой, пишите свой
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#9
TIA, разве это не полиморфизм?
перегрузка, по-идее, это создание двух одноименных процедур с разными параметрами в одной области видимости...
хотя, я уже не помню как этот термин применяется в контексте ООП, по-идее, так же...

---
хотя, получается, что тут полиморфизм с возможностью перезгрузки... но области видимости разные...
 

TIA

:-)
Lotus team
15.05.2009
790
3
#10
Akupaka
Полиморфизм - это концепция, в LS частично реализованная через переопределение (overwrite) методов. А ты это к чему?
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#11
к тому, что в LS нет перегрузки методов, а твой пример отображает наследование и полиморфизм, а не перегрузку, или я не прав...
а почему частично? нормально, на сколько я понимаю концепцию :blink:
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 569
263
#12
Увы, LS в отличие от С++ перегрузку функций не позволяет - два конструктора создать не удалось :blink:. Оставил свой вариант с инициализацией автоклоуза.
вы хотели доп. конструктор... - я недопонял
я полагал - хотите расширить исходный
 

TIA

:-)
Lotus team
15.05.2009
790
3
#13
Для конструкторов нет переопределения. В C++ и J тоже. Т.к. конструкторы базовых классов вызываются безусловно.
Мой пример показывает, как организовать конструктор наследника в котором и можно было бы проинициализировать AutoClose (или что там надо было). Про "частичность" реализации углубляться не буду - отдельная большая тема. На поверхности, то о чём говоришь - в LS нет перегрузки. Реализация для "скрипта" действительно не плохая, но слабоватая для полноценного индустриального языка.
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#14
Т.к. конструкторы базовых классов вызываются безусловно
в общем-то да, но т.к. фактически возможность дополнить метод остается, то полиморфизм все еще тут :blink:
Мой пример показывает, как организовать конструктор наследника в котором и можно было бы проинициализировать
согласен, меня сбило с толку расхождение в терминологии и реализации...
Про "частичность" реализации углубляться не буду - отдельная большая тема...
Реализация для "скрипта" действительно не плохая, но слабоватая для полноценного индустриального языка
ну, если есть время на объяснение точки зрения, я с удовольствием почитаю, вероятно даже, что поспорю о чем-то ))
 

nvyush

Lotus team
22.04.2009
2 317
0
#15
Для конструкторов нет переопределения. В C++ и J тоже. Т.к. конструкторы базовых классов вызываются безусловно.
На счет Java не знаю, но С++ позволяет определять для одного класса несколько конструкторов с разными наборами параметров, по крайней мере в CBuilder. Кстати, в моем случае можно было бы обойтись и необязательным параметром, но они тоже не поддерживаются :). Или в 8.5 Лотусе уже есть такое счастье, кто знает?

Что касается темы поста, опять словил тот же глюк, но уже в другом месте. В форме (немодальной) встроенная вьюха, у нее в queryopen инициализируются глобальные переменные uiview и view. В экшене вьюхи пытаю UIView.CaretNoteID и получаю ошибку: UIView - пустой. Ошибка вылетает как правило после рекомпиляции всех модулей, стоит пересохранить вьюху - все работает нормально. Проблема в том, что таких конструкций несколько, а ошибки иногда начинают лезть и без рекомпиляции.

Пробовал workspace.currentview, но он возвращает нормальное, а не внедренное представление.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 569
263
#16
как я уже упоминал UI - глюкав, и никто его не будет лечить...
все UI объекты - "короткоживущие" (условно), попытка сделать их глобальными и ссылаться на них чревата малевичем

обычно в эвенты передаются к-л объекты - вот ими и можно оперировать
для встроенных объектов - всё ещё менее прогнозируемо...
проистекать это может от того, что "фокус" окна (порой невидимого) уходит с контрола (собсно это и является причиной особого положения модальных окон)
честно - я не вижу особого смысла глобальной инициализации view и uiview...

неисключено, что вьюшка (во встроенном положении) инициализир. не один раз и сущ. в виде разных инстансов в памяти
также возможно - при нек. "инициализациях" не все события (методы) отрабатываются