• 0
estra

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

Вопросы

Вопрос в продолжение темы Как правильно удалять контролы в 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 его больше не видел?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 ответов на этот вопрос

  • 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

Тогда:

  • или воспользуйтесь DisposeOf.
  • Либо проверьте счетчик ссылок после вашего "удаления".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

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

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

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

Изменено пользователем kami

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

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

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