Форум: "Начинающим";
Текущий архив: 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