Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];

Вниз

проблема с уничтожением поля объекта   Найти похожие ветки 

 
Creative   (2006-02-16 11:21) [0]

Есть компонента TDawGrid. Есть объект класса
TParent = class
   FChild = TChild;
И поле FChild у него пока пустое

При клике на любую ячейку:
1. при отмеченном чекбоксе должен создаваться объект TChild и прописываться в поле TParent.FChild
2. при неотмеченном чекбоксе если TChild`а еще не существует, то ничего не делать, а если он таки есть, ч то уничтожить его и очистить поле родитела. Это делается строкой
if Assigned(FChild) then FChild.Free;

И здесь проблема: дубуггер показал, что проходя через эту строку, программа не уничтожает объект и поле FChild не становится = nil (чему оно становится равно - вообще непонятно)

А при повторном клике на ту же ячейку (где по идее не должно быть уже никакого Child`а) программа вылетает

Есть подозрение, что процедура уничтожения объекта написана некорректно. Помогите плиз.


 
Ega23 ©   (2006-02-16 11:34) [1]


> if Assigned(FChild) then FChild.Free;


if Assigned(FChild) then
begin
 FChild.Free;
 FChild:=nil;
end;


 
Плохиш ©   (2006-02-16 11:35) [2]


> И здесь проблема: дубуггер показал, что проходя через эту
> строку, программа не уничтожает объект и поле FChild не
> становится = nil

Никто и никогда не заявлял, что Free присваивает nil указателю на объект, хотя бы потому, что объект ничего не знает о том кто на него указывает. В общем случае количество указателей на объект равно от 0 до бесконечности.
Присвоить значение переменной (в данном случае значение nil) должен программист, разрабатывающий/модифицирующий программу.


 
umbra ©   (2006-02-16 11:40) [3]


> if Assigned(FChild) then FChild.Free;

при вызове метода Free указатель на объект не становится равным nil и функция Assigned возвращает true, после чего программа обращается к уже не существующему объекту. Чтобы Указатель стал равным nil, надо или явно присвоить ему это значение или использовать фунцию FreeAndNil. Т.е. писать или

if Assigned(FChild) then
begin
 FChild.Free;
 FChild := nil;
end;


или

if Assigned(FChild) then FreeAndNil(FChild);


 
Marser ©   (2006-02-16 11:50) [4]

> Assigned(FChild) then Free
Assigned лишнее. Free выполняет всю его работу.


 
Creative   (2006-02-16 11:51) [5]

Спасибо всем, проблема решена. Да здравствует форум! :-)



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

Форум: "Начинающим";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.021 c
2-1140251499
Vandet
2006-02-18 11:31
2006.03.05
Здравствуйте помогите пожалуйста


15-1139492255
Странник
2006-02-09 16:37
2006.03.05
Borland уходит из бизнеса IDE


5-1126106842
TStas
2005-09-07 19:27
2006.03.05
Редактор нестандартного свойсва


15-1139377623
DimonS
2006-02-08 08:47
2006.03.05
Опять вопросик про фотопечать.


11-1120726093
chum
2005-07-07 12:48
2006.03.05
KOL DB и обработка ошибок





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский