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

Как правильно уничтожить форму?


Дениска

Вопрос

Пустое приложение. У меня есть формы: А и B.

А по кнопке создаёт и показывает B и сразу самоуничтожается:

 

B := TB.Create(nil);
B.Show;
A.Free;
 
B в свою очередь делает обратное:
 
A := TA.Create(nil);
A.Show;
B.Free;
 
На Win32 платформе в диспетчере задач память по мере открытия форм не растёт. В iOS 6.1.1 iPhone 3 проследить память я не смог, но после 5-10 открытий форм приложение падает. Вероятнее всего растёт хип (heap). 
 
Почему тогда не работает FREE?? Как правильно освободить память и уничтожить форму в iOS???
 
Я нашёл ответ. Если на форме есть картинки, то их нужно: Image1.Bitmap.Assign(nil);
Изменено пользователем Дениска
Ссылка на комментарий

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

  • 0

 

Пустое приложение. У меня есть формы: А и B.

А по кнопке создаёт и показывает B и сразу самоуничтожается:

 

B := TB.Create(nil);
B.Show;
A.Free;
 
B в свою очередь делает обратное:
 
A := TA.Create(nil);
A.Show;
B.Free;
 
На Win32 платформе в диспетчере задач память по мере открытия форм не растёт. В iOS 6.1.1 iPhone 3 проследить память я не смог, но после 5-10 открытий форм приложение падает. Вероятнее всего растёт хип (heap). 
 
Почему тогда не работает FREE?? Как правильно освободить память и уничтожить форму в iOS???
 
Я нашёл ответ. Если на форме есть картинки, то их нужно: Image1.Bitmap.Assign(nil);

 

в Delphi XE7 Update 1 вроде все нормуль

обычный close работает

версия какая у Вас?

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

У меня XE7 update1. Я нашёл ещё одну причину такого поведения. Проблема решена. В мобильных платформах вместо Free или Close нужно использовать DisposeOf. 

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

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

DisposeOf не освобождает память, а просто вызывает деструктор.

Можно не использовать его, а использовать обычный Close с TCloseAction.caFree.

Я проверял на мобильном компиляторе (Android) - все уничтожается корректно, срабатывает деструктор формы.

Обязательно создавать надо форму с Owner nil, иначе форма не уничтожится. 

frmLoading := TfrmLoading.Create(nil);
frmLoading.Show;

//В форме:

procedure TfrmLoading.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := TCloseAction.caFree;
end;

//Уничтожаем:

frmLoading.Close;
frmLoading := nil;

 

Если на ARC компиляторах вместо Close, вызвать FreeAndNil(frmLoading)  - форма не уничтожится и останется видимой.

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

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

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

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

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

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

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

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

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

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