Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

проблема с уничтожением поля объекта [D7, XP]


Creative ©   (2006-02-16 11:21:00) 

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

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

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

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

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


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

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


Marser   (2006-02-16 11:50:00) [2]

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


umbra   (2006-02-16 11:40:00) [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);


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


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

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


Ega23   (2006-02-16 11:34:00) [5]


> if Assigned(FChild) then FChild.Free;


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


Наверх

Титульная страница Поиск, карта сайта Написать письмо