![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание и удаление объектов в Run-time
Саша © (2009-06-05 06:51:00)Всем привет!
Столкнулся с проблемой, что указатель на экземпляр класса после вызова метода 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"
Ins (2009-06-05 12:36:00) [1]Суровая действительность :D
Dennis I. Komarov (2009-06-05 12:30:00) [2]
> Free - значит "свободен", так что Free :)
Это только так кажется, а на самом деле Destroy :)
Ins (2009-06-05 12:24:00) [3]
> Так это уже не "Free" :)
Free - значит "свободен", так что Free :)
Игорь Шевченко (2009-06-05 11:04:00) [4]Доктор сказал: "в морг", значит в морг
Dennis I. Komarov (2009-06-05 10:55:00) [5]А это уже скорее преобразование типов ;)
Palladin (2009-06-05 10:52:00) [6]Скажем так, вознесся или пал. )
Dennis I. Komarov (2009-06-05 10:51:00) [7]Так это уже не "Free" :)
Palladin (2009-06-05 10:41:00) [8]Угу. Переехал. Вверх или вниз :)
Юрий Зотов (2009-06-05 10:28:00) [9]И тут общественность сказала: "Ну вот - ведь можешь, когда захочешь".
:o)
Юрий Зотов (2009-06-05 10:23:00) [10]По многочисленным просьбам общественности: хорошо, он не умер. Он переехал в другой город. И там ему стало жить лучше.
:o)
Ega23 (2009-06-05 10:16:00) [11]
> Юрий Зотов © (05.06.09 07:11) [5]
Бр-р-р... Аж передёрнулся....
Юрий Зотов (2009-06-05 08:07:00) [12]> MsGuns © (05.06.09 08:05) [6]
Это всего лишь жизнь...
:o)
MsGuns (2009-06-05 08:05:00) [13]Ну и примерчик у Вас, Юрий ;(
Юрий Зотов (2009-06-05 07:11:00) [14]> Саша (05.06.09 06:51)
Пример "на пальцах". Жил человек. Его телефон был записан в книжках у 100 его друзей. Человек умер. А что стало с записями? Ничего, они остались. А как они могли исчезнуть, если их никто не чистил?
Саша (2009-06-05 07:10:00) [15]procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;
Да, собственно ничего волшебного (
Саша (2009-06-05 07:09:00) [16]Дохотчиво.
Спасибо!
Юрий Зотов (2009-06-05 07:05:00) [17]Есть объект - экземпляр класса TTreeView. На него ссылается переменная t. Об этой переменной объект ничего не знает. На этот же объект могут ссылаться еще хоть 100 переменных, и ни об одной из них он тоже ничего не знает. Объект вообще ничего о ссылках на себя не знает. Он же не может знать что там программист напрограммировал? Не может, естественно.
Объект удаляется - то есть, выполняет цепочку своих методов, начиная с Free. Спрашивается - каким волшебным образом объект может обнулить ссылку на себя, если он об этой ссылке не знает? Тем более, если таких ссылок 100.
Используйте FreeAndNil(t) вместо t.Free. Детали см. в справке.
MBo (2009-06-05 07:01:00) [18]>указатель на экземпляр класса после вызова метода Free продолжает быть ассоциированным с чем-то, т.е. <> nil.
Эт нормально
>Неужеле в блоке после t.Free нужно каждый раз присваивать t к nill
FreeAndNil можно использовать при желании
однако многократное использование (классовых) переменных не все считают правильным....