Перейти к содержанию
  • Регистрация
  • 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 эмодзи.

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

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

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


  • Похожий контент

    • От FREEFAR
      Друзья, помогите-таки расставить точки над "И".
      Как же все таки правильно уничтожать динамически создаваемые компоненты TFrame
      Сейчас делаю так:
                        mapFrame.DisposeOf;
                        mapFrame.Parent := nil;
                        mapFrame := nil;
      Вроде удаляется и новый создается.
      Но вот беда.
      Если я создам функцию типа FreeFrame(Frame: TFrame);
      то как бы я ее не вызывал с входным параметром "mapFrame"
      фрейм все равно живет...
      Что не так? Куда копать?
    • От Barbanel
      Здравствуйте!
      Подскажите пожалейста, устанавливаются ли какие-либо стандартные Define при компиляции приложения для Play Store?
      Понятно что можно установить свои дефайны, разные для дебага и релиза, но хочется знать, существуют ли стандартные.
      Спасибо, всем хорошего дня =)
    • От Alex7wrt
      Добрый день.
      Знаю, что на форуме есть несколько тем о том, как удалять объекты под Android и счетчике ссылок, однако использование рекомендаций оттуда мне пока не помогло.
      Суть вопроса: создаю свой класс

       
      type TRext =class(TRectangle) Text: TText; procedure RextMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); procedure RextMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); procedure RextMouseLeave(Sender: TObject); Constructor Create(AOwner: TComponent); override; Destructor Destroy; override; end; type TMyChoose = class Item1, Item2, Item3: TRext; Edits: TEdit; procedure ItemClick(Sender: TObject); procedure OnEditFocus(Sender: TObject; var ACanFocus: Boolean); Constructor Create(Form: TForm); Destructor Destroy; override; end; ..... constructor TRext.Create(AOwner: TComponent); begin inherited Create(AOwner); Text:=TText.Create(Self); Text.Parent:=Self; Text.Align:=TAlignLayOut.Client; Self.Text.OnMouseDown:=RextMouseDown; Self.Text.OnMouseUp:=RextMouseUp; Self.Text.OnMouseLeave:=RextMouseLeave; end; Destructor TRext.Destroy; begin Text.Release; Text:=nil; inherited; end; constructor TMyChoose.Create(Form: TForm); begin inherited Create; Item1:=TRextCreate(Form); Item1.Parent:=Form; Item1.Align:=tAlignLayout.MostLeft; Item2:=TRextCreate(Form); Item2.Parent:=Form; Item2.Align:=tAlignLayout.MostLeft; Item3:=TRextCreate(Form); Item3.Parent:=Form; Item3.Align:=tAlignLayout.MostLeft; Edits:=TEdit.Create(Form); Edits.Parent:=Form; Edits.Align:=tAlignLayout.MostLeft; ......... end; Destructor TMyChoose.Destroy; begin Item1.Release; Item1:=nil; Item2.Release; Item2:=nil; Item3.Release; Item3:=nil; Edits.Release; Edits:=nil; inherited; end; Под Windows все нормально работает и уничтожается. Под Android вызов Destroy у объекта типа TMyChoose не приводит ни к чему.
      Вместо Release и nil использовал также DisposeOf и Nil, а также FreeAndNil - результат аналогичный.
      Как правильно уничтожать составные объекты?
    • От rareMax
      Пасаны - хватай ее: https://www.embarcadero.com/ru/products/delphi/starter/promotional-download
      В след за плюсами начали раздавать делфи стартер. Функционал урезан до жути, но возможно вам много и не нужно?
    • От alexbirukov
      Установил новую студию ради исправления одной ошибки, и наткнулся на другую, ещё более критичную.
       
      В общем и в новых и в старых проектах одинаковая ситуация. Если на форме имеются компоненты KinveyProvider (ParseProvider) и PushEvent, то в режиме Release - Application Store приложение запускается, но после сплэш скрина просто чёрный экран и ничего не происходит, приложение зависает. В режиме Debug всё отлично запускается и работает, Push приложения приходят. Все разрешения есть, даже больше, специально выставлял абсолютно все разрешение.
       
      В режиме отладки не запускается, приложение просто подвисает, отладчик ругается, что оно не отвечает. 
       
      Мучаюсь уже второй день, может кто сталкивался или знает куда копать, буду рад любому совету.
    • От Kikoma
      Следующая ситуация:
       
      Есть база данных с полями: id, product_name, price, cart (корзина) - Думаю пояснять излишне.
       
      по условию cart>0 формируется запрос и заполняется TListBox кастомизированным Item-ом который содержит SpinBox. при изменении SpinBox вызывается процедура, которая вносит изменение в БД (cart) и высчитывает сумму в этом Item.
       
      Все работает, все хорошо, но...
      Задумал я что при SpinBox = 0, у меня этот TListBoxItem исчезал, для этого на изменение SpinBox если он равен 0, я запускаю процедуру формирования (Заполнения) этого TListBox заново.
       
      Вываливается ошибка Access ..to address XXX, при чем при пошаговой трассировки исключение вызывает FMX.Edit строка 3811 CustomEditBox.Change; в procedure TValueRangeCustomEditBox.DoAfterChange; (DELPHI XE6)
       
      т.е. моя процедура полностью отрабатывается (Заполняется новый список Item-ов) и возникает эта ошибка.
       
      При чем на 32-bit Windows все работает нормально, только на андроиде возникает это исключение, при чем приложение продолжает нормально функционировать.
       
      Если я правильно понимаю, то эта процедура DoAfterChange пытается что то сделать с объектом, которого уже нет.
       
      Это баг или я неправильно алгоритм построил?
       
       
    • От 97mik
      Как правильно создавать и удалять объекты в run time?
      А то создаю так:
      c[r] := TCircle.Create(TabItem1); c[r].Position.X := 1; c[r].Position.Y := 1; c[r].Width := 50; c[r].Height := 50; c[r].Parent := TabItem1; И разрушаю так:
      c[r].Free; То в Win всё ок, а на симуляторе iOS объекты не разрушаются, а просто остаются.
      Попробовал так:
      c[r].Destroy; Тогда всё на Win опять всё ок, а на симуляторе разрушается, но при попытке снова создать - приложение крашится.
    • От rareMax
      Смотрел примеры для новой версии XE6 - и увидел что в блоке try finally для освобождения пишут DisposeOf вместо Free. Можете рассказать в каких случаях писать Free а в каких DisposeOf? Спасибо.
  • Последние посетители   0 пользователей онлайн

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

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