Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1244397306
MADMAN
2009-06-07 21:55
2009.08.02
Помогите с SQL запросом


2-1244525658
SupSub
2009-06-09 09:34
2009.08.02
Как из двух строк сделать одну


15-1243858614
И. Павел
2009-06-01 16:16
2009.08.02
Зависает BDS2005


3-1225350632
prisoner849
2008-10-30 10:10
2009.08.02
Как проапдейтить определенное поле в таблице?


15-1243584571
Клерк
2009-05-29 12:09
2009.08.02
Дизайн пользовательского интерфейса 2





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский