Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / То ли лыжи не едут, то ли я ... / 7 сообщений из 7, страница 1 из 1
28.01.2010, 14:50
    #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
28.01.2010, 15:41
    #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
28.01.2010, 16:21
    #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
28.01.2010, 16:31
    #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
28.01.2010, 16:55
    #36436779
SoftParanoik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
То ли лыжи не едут, то ли я ...
Я понял вашу мысль.
В явном виде, как я уже говорил, такая ситуация не наблюдается!
Но,видимо, вы правы!
На самом деле, иерархия классов у меня гораздо более сложная, чем я описывал.
Скорее всего где-то в глубинах иерархии и происходит нечто подобное.
Пожалуй, я пересмотрю свою модель в сторону упрощения.
А там посмотрим!
Спасибо!
...
Рейтинг: 0 / 0
29.01.2010, 07:54
    #36437637
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
То ли лыжи не едут, то ли я ...
SoftParanoikЯ понял вашу мысль.
В явном виде, как я уже говорил, такая ситуация не наблюдается!
Но,видимо, вы правы!
На самом деле, иерархия классов у меня гораздо более сложная, чем я описывал.
Скорее всего где-то в глубинах иерархии и происходит нечто подобное.
Пожалуй, я пересмотрю свою модель в сторону упрощения.
А там посмотрим!
Спасибо!
Посмтрите, может у вас удаление объекта происходит в окружении
WITH Объекта

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

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


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