Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.02;
Скачать: CL | DM;

Вниз

Создание и удаление объектов в Run-time   Найти похожие ветки 

 
Саша   (2009-06-05 06:51) [0]

Всем привет!

Столкнулся с проблемой, что указатель на экземпляр класса после вызова метода Free продолжает быть ассоциированным с чем-то, т.е. <> nil.

Допустим на форме есть две кнопки:
1. Создать объект

if not Assigned(t) then
t:=TTreeView.Create(self)

2. Удалить объект

if Assigned(t) then
t.free;

Выполняемые действия:
1. Создали объект // все в норме, как и предполагалось
2. Удалить объект // Все нормально, визуально удаляется
3. Пытаемся вновь создать объект, но вот здесь создания не происходит, потому что Assigned(t)<>nil равно как t<>nil.
Почему???
Неужеле в блоке после t.Free нужно каждый раз присваивать t к nill ???Использую "Borland® Delphi® for Microsoft® Windows™ Version 10.0.2151.25345"


 
MBo ©   (2009-06-05 07:01) [1]

>указатель на экземпляр класса после вызова метода Free продолжает быть ассоциированным с чем-то, т.е. <> nil.
Эт нормально

>Неужеле в блоке после t.Free нужно каждый раз присваивать t к nill
FreeAndNil можно использовать при желании

однако многократное использование (классовых) переменных не все считают правильным....


 
Юрий Зотов ©   (2009-06-05 07:05) [2]

Есть объект - экземпляр класса TTreeView. На него ссылается переменная t. Об этой переменной объект ничего не знает. На этот же объект могут ссылаться еще хоть 100 переменных, и ни об одной из них он тоже ничего не знает. Объект вообще ничего о ссылках на себя не знает. Он же не может знать что там программист напрограммировал? Не может, естественно.

Объект удаляется - то есть, выполняет цепочку своих методов, начиная с Free. Спрашивается - каким волшебным образом объект может обнулить ссылку на себя, если он об этой ссылке не знает? Тем более, если таких ссылок 100.

Используйте FreeAndNil(t) вместо t.Free. Детали см. в справке.


 
Саша   (2009-06-05 07:09) [3]

Дохотчиво.
Спасибо!


 
Саша   (2009-06-05 07:10) [4]

procedure FreeAndNil(var Obj);
var
 Temp: TObject;
begin
 Temp := TObject(Obj);
 Pointer(Obj) := nil;
 Temp.Free;
end;

Да, собственно ничего волшебного (


 
Юрий Зотов ©   (2009-06-05 07:11) [5]

> Саша   (05.06.09 06:51)  

Пример "на пальцах". Жил человек. Его телефон был записан в книжках у 100 его друзей. Человек умер. А что стало с записями? Ничего, они остались. А как они могли исчезнуть, если их никто не чистил?


 
MsGuns ©   (2009-06-05 08:05) [6]

Ну и примерчик у Вас, Юрий ;(


 
Юрий Зотов ©   (2009-06-05 08:07) [7]

> MsGuns ©   (05.06.09 08:05) [6]

Это всего лишь жизнь...
:o)


 
Ega23 ©   (2009-06-05 10:16) [8]


> Юрий Зотов ©   (05.06.09 07:11) [5]


Бр-р-р... Аж передёрнулся....


 
Юрий Зотов ©   (2009-06-05 10:23) [9]

По многочисленным просьбам общественности: хорошо, он не умер. Он переехал в другой город. И там ему стало жить лучше.
:o)


 
Юрий Зотов ©   (2009-06-05 10:28) [10]

И тут общественность сказала: "Ну вот - ведь можешь, когда захочешь".
:o)


 
Palladin ©   (2009-06-05 10:41) [11]

Угу. Переехал. Вверх или вниз :)


 
Dennis I. Komarov ©   (2009-06-05 10:51) [12]

Так это уже не "Free" :)


 
Palladin ©   (2009-06-05 10:52) [13]

Скажем так, вознесся или пал. )


 
Dennis I. Komarov ©   (2009-06-05 10:55) [14]

А это уже скорее преобразование типов ;)


 
Игорь Шевченко ©   (2009-06-05 11:04) [15]

Доктор сказал: "в морг", значит в морг


 
Ins ©   (2009-06-05 12:24) [16]


> Так это уже не "Free" :)


Free - значит "свободен", так что Free :)


 
Dennis I. Komarov ©   (2009-06-05 12:30) [17]


> Free - значит "свободен", так что Free :)

Это только так кажется, а на самом деле Destroy :)


 
Ins ©   (2009-06-05 12:36) [18]

Суровая действительность :D



Страницы: 1 вся ветка

Текущий архив: 2009.08.02;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.013 c
11-1202393103
Jon
2008-02-07 17:05
2009.08.02
Multi screen output


4-1213778010
incm
2008-06-18 12:33
2009.08.02
Как в главном окне перехватывать сообщения WM_MDICREATE и т.п.


2-1244224996
Nekroraise
2009-06-05 22:03
2009.08.02
цвет TColor в формат цвета фотошопа(и не только)..


11-1204274900
andreil
2008-02-29 11:48
2009.08.02
Проблема с добавлением форм :(


15-1244135367
POGiMplayer
2009-06-04 21:09
2009.08.02
Ограничить скорость Интернета.