Перейти к содержанию
Fire Monkey от А до Я
  • 0

Уничтожение TFrame


FREEFAR

Вопрос

Друзья, помогите-таки расставить точки над "И".

Как же все таки правильно уничтожать динамически создаваемые компоненты TFrame

Сейчас делаю так:

                  mapFrame.DisposeOf;
                  mapFrame.Parent := nil;
                  mapFrame := nil;

Вроде удаляется и новый создается.

Но вот беда.

Если я создам функцию типа FreeFrame(Frame: TFrame);

то как бы я ее не вызывал с входным параметром "mapFrame"

фрейм все равно живет...

Что не так? Куда копать?

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
18 часов назад, wamaco сказал:

Передавать Frame надо по ссылке, вот так:

FreeFrame(var Frame: TFrame);

То есть все дело в том что я в объявлении не написал var?

Ссылка на комментарий
  • 1
В 10.11.2017 в 20:23, FREEFAR сказал:

mapFrame.DisposeOf;
 mapFrame.Parent := nil;

Я бы поменял их местами.

Несколько странно сперва уничтожать объект, а потом обращаться к его полям и методам...

Ссылка на комментарий
  • 0
13 часа назад, kami сказал:

Я бы поменял их местами.

Несколько странно сперва уничтожать объект, а потом обращаться к его полям и методам...

Учтём, благодарю 

Ссылка на комментарий
  • 0
В 11.11.2017 в 15:18, FREEFAR сказал:

То есть все дело в том что я в объявлении не написал var?

без var процедура FreeFrame внутри себя создаст копию переменной и будет ею оперировать

Ссылка на комментарий
  • 0

все-таки вернусь к логической загадке ARC

1. если вы все ссылки на объект обнулили, то вызывать его деструктор не требуется, его вызовут за вас

2. если не все обнулили, но вызвали деструктор, значит имеем нехилую вероятность того, что кто-то, у кого осталась ссылка, обратится по ней к объекту. тогда мы имеем гарантированный AV

3. Тогда зачем все эти варианты с DisposeOF ???

 

У меня вся программа на фреймах построена, и ничего, создаются удаляются. При этом отлаживаюсь я в Win64, а потом запускаю на Andoird. И все работает штатно в обоих случаях. 

Единственное отличие, я обычно не указываю владельца (Owner). Т.е.  F:=TMyFrame.Create(NIL)

После использования сам убираю за собой
F.Parent:=NIL;
FreeAndNil(F)

и все норм. 

В некоторых фреймах еще большинство компонентов в динамике создается и пересоздается. и тоже никаких явных вызовов деструктора.

Так что лучше все-таки следовать архитектуре, а не раскладывать костылики...

Ссылка на комментарий
  • 0
13 часов назад, krapotkin сказал:

все-таки вернусь к логической загадке ARC

1. если вы все ссылки на объект обнулили, то вызывать его деструктор не требуется, его вызовут за вас

2. если не все обнулили, но вызвали деструктор, значит имеем нехилую вероятность того, что кто-то, у кого осталась ссылка, обратится по ней к объекту. тогда мы имеем гарантированный AV

3. Тогда зачем все эти варианты с DisposeOF ???

 

У меня вся программа на фреймах построена, и ничего, создаются удаляются. При этом отлаживаюсь я в Win64, а потом запускаю на Andoird. И все работает штатно в обоих случаях. 

Единственное отличие, я обычно не указываю владельца (Owner). Т.е.  F:=TMyFrame.Create(NIL)

После использования сам убираю за собой
F.Parent:=NIL;
FreeAndNil(F)

и все норм. 

В некоторых фреймах еще большинство компонентов в динамике создается и пересоздается. и тоже никаких явных вызовов деструктора.

Так что лучше все-таки следовать архитектуре, а не раскладывать костылики...

Привет. Так не делал никогда. Пока во всех проектах поле использования динамически созданных объектов вызваю DisposeOf... И вот интересно в чем отличие твоего варианта от используемого мной. Как правильно с этим жить? ))

Ссылка на комментарий
  • 0

Отличие я рассказал. Деструктор должен вызываться сам. Архитектура на это рассчитана. Если не вызывается, значит что программа несовместима с ней. Это никак не говорит о том, что она не будет работать. Но говорит о том что внутри - мины

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...