• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы nvyush
  • Дата начала
N

nvyush

Здравствуйте все!

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
без кода - сложно угадывать....
речь идет об инвьюедите?
 
N

nvyush

без кода - сложно угадывать....
речь идет об инвьюедите?

Форма с внедренным представлением открывается в диалоге. В представлении определены события
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
7 933
609
BIT
177
я уже упоминал - иногда UI ф-ции Нотуса и АПИ (именно UI) к ним глючат
и особенной "любовью" пользуются модальные окна
почему теряется объект я не знаю...
в кач. совета - создавайте его по- месту (а не на опен), ведь очередь без автоклозе будет жить
 
N

nvyush

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

Спасибо за совет - перенес все в OnSelect и глюк пропал. Кстати, а LS позволяте перегрузить New - создать второй конструктор, чтоб значение автоклоуза устанавливать сразу в конструкторе?
(+1).
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
да - позволяет, но там и класс небольшой, пишите свой
 
T

TIA

а LS позволяте перегрузить New - создать второй конструктор, чтоб значение автоклоуза устанавливать сразу в конструкторе?

Да.

Class A
Sub new( par1$ )
End Sub
End Class

Class B As A
Sub new( par2, par3), A(par3)
End Sub
End Class
 
N

nvyush

да - позволяет, но там и класс небольшой, пишите свой

Увы, LS в отличие от С++ перегрузку функций не позволяет - два конструктора создать не удалось :). Оставил свой вариант с инициализацией автоклоуза.
 
A

Akupaka

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

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

TIA

Akupaka
Полиморфизм - это концепция, в LS частично реализованная через переопределение (overwrite) методов. А ты это к чему?
 
A

Akupaka

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
Увы, LS в отличие от С++ перегрузку функций не позволяет - два конструктора создать не удалось :blink:. Оставил свой вариант с инициализацией автоклоуза.
вы хотели доп. конструктор... - я недопонял
я полагал - хотите расширить исходный
 
T

TIA

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

Akupaka

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

nvyush

Для конструкторов нет переопределения. В C++ и J тоже. Т.к. конструкторы базовых классов вызываются безусловно.

На счет Java не знаю, но С++ позволяет определять для одного класса несколько конструкторов с разными наборами параметров, по крайней мере в CBuilder. Кстати, в моем случае можно было бы обойтись и необязательным параметром, но они тоже не поддерживаются :). Или в 8.5 Лотусе уже есть такое счастье, кто знает?

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

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
как я уже упоминал UI - глюкав, и никто его не будет лечить...
все UI объекты - "короткоживущие" (условно), попытка сделать их глобальными и ссылаться на них чревата малевичем

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

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

TIA

nvy
На счет Java не знаю, но С++ позволяет определять для одного класса несколько конструкторов с разными наборами параметров
Это называется "перегрузка" (overload), я писал о "переопределении" (overwrite).
 
Мы в соцсетях:

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