powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / То ли лыжи не едут, то ли я ...
7 сообщений из 7, страница 1 из 1
То ли лыжи не едут, то ли я ...
    #36436367
SoftParanoik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

В проекте определил класс MyClass на основе Custom.
В обработке события Destroy задал такой код: messagebox("Destroy !!!").
Создаю экземпляр: nn=newobject("MyClass").
Работаю с объектом.
Пытаюсь объект удалить (варианты: nn=0, release nn) в памяти объект удаляется, но не срабатывает обработчик Destroy!
Пытаюсь в проекте открыть класс - "Cannot modify a class that is in use".
И только после команды CLEAR ALL срабатывает Destroy и описание класса в проекте разблокируется!
В чем причина?
...
Рейтинг: 0 / 0
То ли лыжи не едут, то ли я ...
    #36436531
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
* Создаю
nn = CreateObject('MyCust')
* Обнуляю переменную
nn = null

*Создаю
nn = CreateObject('MyCust')
* Удаляю переменную
Release nn

*Создаю
nn = CreateObject('MyCust')
* Копирую в другую переменную
mm = nn
* Удаляю переменную
Release nn

MessageBox("Есть еще mm")

Define Class MyCust as Custom 

Procedure Destroy
	MessageBox('Destroy')
Return
EndProc

EndDefine

Разрушение объекта происходит тогда, когда будет обнулена последняя ссылка на этот объект.

Как видите, в первых двух случаях Destroy сработал сразу после удаления или зануления переменной, содержащей единственную ссылку на объект, а в последнем случае удаление переменной nn ничего не дало. Поскольку осталась еще одна ссылка в переменной mm

Каим образом Вы используете переменную nn? Никуда не записываете ее, например

Код: plaintext
MyObject.MyProp = nn
...
Рейтинг: 0 / 0
То ли лыжи не едут, то ли я ...
    #36436651
SoftParanoik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
* Создаю
nn = CreateObject('MyCust')
* Обнуляю переменную
nn = null

*Создаю
nn = CreateObject('MyCust')
* Удаляю переменную
Release nn

*Создаю
nn = CreateObject('MyCust')
* Копирую в другую переменную
mm = nn
* Удаляю переменную
Release nn

MessageBox("Есть еще mm")

Define Class MyCust as Custom 

Procedure Destroy
	MessageBox('Destroy')
Return
EndProc

EndDefine

Разрушение объекта происходит тогда, когда будет обнулена последняя ссылка на этот объект.

Как видите, в первых двух случаях Destroy сработал сразу после удаления или зануления переменной, содержащей единственную ссылку на объект, а в последнем случае удаление переменной nn ничего не дало. Поскольку осталась еще одна ссылка в переменной mm

Каим образом Вы используете переменную nn? Никуда не записываете ее, например

Код: plaintext
MyObject.MyProp = nn


В явном виде такой ситуации не наблюдается.
Однако ваш комментарий посеял в моей душе сомнения.
Суть вопроса:
Есть базовый класс BClass(Custom),
Есть два класса оба наследующие от BClass: ChClass1 и ChClass2
В классе ChClass1 есть свойство MyProp(Hidden)
В конструкторе класса ChClass1 (метод Init) создаю экземпляр класса ChClass2 и помещаю ссылку на него в MyProp
В деструкторе класса ChClass1 (метод Destroy) зануляю MyProp
Создаю объект класса ChClass1
Удаляю объект - Destroy не срабатывает!
Формально, в объекте я храню ссылку на экземпляр другого класса, так что ссылочной блокировки быть не должно!
Если только не предположить, что ссылочная блокировка произошла на уровне базового класса.
...
Рейтинг: 0 / 0
То ли лыжи не едут, то ли я ...
    #36436700
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понял Ваш сценарий, то у меня все работает

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
nn = CreateObject('ChClass1')
nn = null

************************ ChClass1
Define Class ChClass1 as BClass 
	Hidden MyProp

Procedure Init
	this.MyProp = CreateObject('ChClass2')
Return
EndProc

Procedure Destroy
	this.MyProp = null
	MessageBox('Destroy ChClass1')
Return
EndProc

EndDefine


************************ ChClass2
Define Class ChClass2 as BClass 

Procedure Destroy
	MessageBox('Destroy ChClass2')
Return
EndProc

EndDefine

************************ BClass
Define Class BClass as Custom 
EndDefine

А вот если перед зануленим ссылки сделать присвоение

mm = nn

то зануление ссылки не вызовет срабатывание Destroy, поскольку еще осталась ссылка на объект.
...
Рейтинг: 0 / 0
То ли лыжи не едут, то ли я ...
    #36436779
SoftParanoik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понял вашу мысль.
В явном виде, как я уже говорил, такая ситуация не наблюдается!
Но,видимо, вы правы!
На самом деле, иерархия классов у меня гораздо более сложная, чем я описывал.
Скорее всего где-то в глубинах иерархии и происходит нечто подобное.
Пожалуй, я пересмотрю свою модель в сторону упрощения.
А там посмотрим!
Спасибо!
...
Рейтинг: 0 / 0
То ли лыжи не едут, то ли я ...
    #36437637
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SoftParanoikЯ понял вашу мысль.
В явном виде, как я уже говорил, такая ситуация не наблюдается!
Но,видимо, вы правы!
На самом деле, иерархия классов у меня гораздо более сложная, чем я описывал.
Скорее всего где-то в глубинах иерархии и происходит нечто подобное.
Пожалуй, я пересмотрю свою модель в сторону упрощения.
А там посмотрим!
Спасибо!
Посмтрите, может у вас удаление объекта происходит в окружении
WITH Объекта

Удаление Объекта (или контейнера, где он находится)
ENDWITH
Конструкция WITH Объекта.... ENDWITH не явно создает переменную - ссылку на Объекта
Внутри нее не надо удалять объекта, т.к. ссылка жива до конца ENDWITH
С уважением, Алексей
...
Рейтинг: 0 / 0
То ли лыжи не едут, то ли я ...
    #36437719
SoftParanoik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-KSoftParanoikЯ понял вашу мысль.
В явном виде, как я уже говорил, такая ситуация не наблюдается!
Но,видимо, вы правы!
На самом деле, иерархия классов у меня гораздо более сложная, чем я описывал.
Скорее всего где-то в глубинах иерархии и происходит нечто подобное.
Пожалуй, я пересмотрю свою модель в сторону упрощения.
А там посмотрим!
Спасибо!
Посмтрите, может у вас удаление объекта происходит в окружении
WITH Объекта

Удаление Объекта (или контейнера, где он находится)
ENDWITH
Конструкция WITH Объекта.... ENDWITH не явно создает переменную - ссылку на Объекта
Внутри нее не надо удалять объекта, т.к. ссылка жива до конца ENDWITH
С уважением, Алексей
Да, это интересная мысль!
Спасибо!
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / То ли лыжи не едут, то ли я ...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]