Форум: "Начинающим";
Текущий архив: 2009.08.02;
Скачать: [xml.tar.bz2];
ВнизСоздание и удаление объектов в 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.288 c