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

[Android] Корректно удаляем TExpander в Android


Skillsoft

Вопрос

Всем привет.

 

Извеняюсь если не в тот раздел написал.

 

Вобщем проблема такая.

 

Есть код:

procedure DeleteMyComponent(Sender:TObject)
var
  c:TComponent;
begin
  c:=Components[1];
  
  if c is TExpander then
    FreeAndNil(c);
end;

При выполнении в Windows  (32-bit Windows / 64-bit Windows) проблем не возникает, компонент удаляется, а при выполнении того же кода в Android ничего не происходит.

 

Хотя привыполнении следующего кода:

procedure DeleteMyComponent(Sender:TObject)
var
  c:TComponent;
begin
  c:=Components[1];
  
  if c is TExpander then
    ShowMessage(c.ClassName);
end;

Выходит Message с текстом TExpander

 

Версия Delphi

http://joxi.ru/Q2K75nWFR7V42j

 

Скажите, может кто в курсе!?

 

Зарание спасибо

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

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

  • 0

Components - это что?

Компоненты чего в смысле? Приложения (Application)? Главной формы? И т.д....

В Вашем случае даже версия под Win не дает гарантии стабильной и правильной работы.

Попробуйте конкретно указать родителя.

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

Я так думаю, когда свойство-метод указывается без родителя, подразумевается TForm, или не всегда?

 

Когда указываю Components или TVertScrollBox.Components набор компонентов всегда один.

 

Код под Windows работает стабильно, проверял в цикле, и с другими компонентами внутри TExpander.

 

http://joxi.ru/brR6aD3s1qk9r1

 

TPanel и TCheckBox находятся внутри TExpander

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

В мобильных платформах работает ARC - пока где-нибудь есть ссылка на объект, он "живёт".

Вам надо просто убрать ссылки на этот компонент.

Т.е. удалить его из списка компонент.

А если вам надо где-то временно хранить ссылку на него, можно объявить такую ссылку "слабой", weak

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

В мобильных платформах работает ARC - пока где-нибудь есть ссылка на объект, он "живёт".

Вам надо просто убрать ссылки на этот компонент.

Т.е. удалить его из списка компонент.

А если вам надо где-то временно хранить ссылку на него, можно объявить такую ссылку "слабой", weak

А можно по подробнее? Пример какой-нибудь.

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

Фактически, когда вы пишете 

if c is TExpander then
    FreeAndNil(c);

То для мобильных платформ это просто обнуляет локальную ссылку. Деструктор класса вызоветс ятолько тогда когда на объект не осталось не одной ссылки. У вас как минимум еще Parent ссылается на этот объект. Если у вас более нигде нет ссылок на этот объект, то такой код уничтожит объект:

if c is TExpander then
begin
  c.Parent := nil;
end;

http://fire-monkey.ru/topic/10-kak-pravilno-udaliat-kontroly-v-runtime/

Изменено пользователем xenon54
Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

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