Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.05;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.026 c
3-1136868924
vale88
2006-01-10 07:55
2006.03.05
IB 6.5 + Pocket PC


4-1134626861
Alex_1234
2005-12-15 09:07
2006.03.05
Информация о версии в результирующем екзешнике...


1-1138528776
diwwww
2006-01-29 12:59
2006.03.05
как при создании формы в LookupCombo выбрать элемент?


11-1120815580
Dodfr
2005-07-08 13:39
2006.03.05
How to breakpoint into kol.pas ?


15-1139317557
Progger
2006-02-07 16:05
2006.03.05
чем Delphi 5 хуже более поздних версий? Или лучше?