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

[android] Как правильно удалять контролы в RunTime(2)?


estra

Вопрос

Вопрос в продолжение темы Как правильно удалять контролы в RunTime? Для начала код тестового приложения

var
  Form1: TForm1;
  Edit: TEdit;

implementation

procedure TForm1.Btn_CreateComponentClick(Sender: TObject);
begin
   Edit := TEdit.Create(Form1);
   Edit.Parent := Form1;
   Edit.Name := 'Edit';
end;

procedure TForm1.Btn_FreeComponentClick(Sender: TObject);
begin
   {$IFDEF AUTOREFCOUNT}
   Edit.Parent := nil;
   {$ENDIF}
   Edit.Free;
end;

procedure TForm1.Btn_FindComponentClick(Sender: TObject);
begin
   if Assigned(FindComponent('Edit')) then
      ShowMessage('Компонент найден')
   else
      ShowMessage('Компонент не найден');
end;

Последовательность действий:

1. Пытаемся найти компонент (Btn_FindComponentClick). Компонент не находится, все OK.

2. Создаем компонент (Btn_CreateComponentClick). Компонент создается, все OK.

3. Пытаемся найти компонент (Btn_FindComponentClick). Компонент находится, все OK.

4. Удаляем компонент (Btn_FreeComponentClick). Компонент якобы удаляется (исчезает с формы). НО…

5. Пытаемся найти компонент (Btn_FindComponentClick). Компонент находится, а это уже не OK. Повторное создание компонента естественно приведет к ошибке "A component named Edit already exists".

Собственно вопрос, как полностью удалить компонент, чтобы FindComponent его больше не видел?

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

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

  • 0
  • Администраторы

Мобильные платформы?

В мобильной платформе, нужно занилить еще указатель

Edit := nil

Иначе у вас счетчик ссылок на этот компонент будет больше 0. и Объект не удалится, а только пропадет с формы.

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

Мобильные платформы?

В мобильной платформе, нужно занилить еще указатель


Edit := nil

Иначе у вас счетчик ссылок на этот компонент будет больше 0. и Объект не удалится, а только пропадет с формы.

Мобильные, андроид. Пробовал и так, но увы, результат прежний.

procedure TForm1.Btn_FreeComponentClick(Sender: TObject);
begin
   {$IFDEF AUTOREFCOUNT}
   Edit.Parent := nil;
   {$ENDIF}
   Edit.Free;
   {$IFDEF AUTOREFCOUNT}
   Edit := nil;
   {$ENDIF}
end;

После удаления компонента FindComponent продолжает находить удаленный компонент.

FindComponent.zip

Изменено пользователем estra
Ссылка на комментарий
  • 0

Сперва - Release, потом = nil

http://fire-monkey.ru/topic/2817-динамическое-созданиеуничтожение/?do=findComment&comment=16461

Free на мобильных платформах не делает ничего.

В вашем коде компонент, естественно, будет продолжать находиться - ведь ссылку на него как минимум хранит его Owner, переданный в конструкторе.

Изменено пользователем kami
Ссылка на комментарий

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

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

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

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

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

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

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

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

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...