Главная страница
    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.011 c
15-1139477303
Хинт
2006-02-09 12:28
2006.03.05
Proxy для HTML


3-1136983239
Asail
2006-01-11 15:40
2006.03.05
Нужна помощь в написании запроса SQL (SELECT)


3-1134642131
softmaster
2005-12-15 13:22
2006.03.05
Вопрос по хранимой процедуре и BDE


2-1140279709
PARUS
2006-02-18 19:21
2006.03.05
IF два условия


2-1139892953
Bolbes
2006-02-14 07:55
2006.03.05
MS SQL





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