Показать сообщение отдельно
  #9  
Старый 18.12.2009, 15:49
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Цитата:
Есть такая информация, что изредка методы Destroy и Free отрабатывают не совсем корректно
Если это не переопределенные кемто методы то отрабатывают они корректно, только дело не в этом.
Вы создаете объект
Код:
frm := TMyTypeForm.Create(<?>);
При этом переменной или свойству frm присваивается ссылка на созданный объект.
Когда Вы пишите frm.Free, объект уничтожается и его память освобождается, НО frm продолжает указывать на то место, где был объект.
Assigned проверяет переменную ( или свойство ) не равно ли оно nil.
Тоже самое делает Free перед вызовом destroy ( поэтому и рекомендуют писать Free а не destroy.
Но чтобы они сработали надо при уничтожении присвоить frm := nil, что и делает функция FreeAndNil. Тогда и Assigned и Free будут работать правильно.
Но FreeAndNil не единственный способ обнуления ссылки при уничтожении оъекта.
Если frm свойство объекта который является наследником от TComponent ( TForm тоже его наследник ) - то можно воспользоваться механизмом нотификации.
Если расскажете по подробнее как и где создается и храниться форма расскажу как сделать.
Код:
procedure FreeAndNil(var Obj);
var
  Temp: TObject;
begin
  Temp := TObject(Obj);
  Pointer(Obj) := nil;
  Temp.Free;
end;
Код:
procedure TObject.Free;
begin
  if Self <> nil then
    Destroy;
end;
Ответить с цитированием