• 0
FREEFAR

Уничтожение TFrame

Вопрос

Друзья, помогите-таки расставить точки над "И".

Как же все таки правильно уничтожать динамически создаваемые компоненты TFrame

Сейчас делаю так:

                  mapFrame.DisposeOf;
                  mapFrame.Parent := nil;
                  mapFrame := nil;

Вроде удаляется и новый создается.

Но вот беда.

Если я создам функцию типа FreeFrame(Frame: TFrame);

то как бы я ее не вызывал с входным параметром "mapFrame"

фрейм все равно живет...

Что не так? Куда копать?

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


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

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

  • 0

Передавать Frame надо по ссылке, вот так:

FreeFrame(var Frame: TFrame);

AlexG понравилось это

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
18 часов назад, wamaco сказал:

Передавать Frame надо по ссылке, вот так:

FreeFrame(var Frame: TFrame);

То есть все дело в том что я в объявлении не написал var?

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
6 часов назад, FREEFAR сказал:

То есть все дело в том что я в объявлении не написал var?

Совершенно верно!

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


Ссылка на сообщение
Поделиться на других сайтах
  • 1
В 10.11.2017 в 20:23, FREEFAR сказал:

mapFrame.DisposeOf;
 mapFrame.Parent := nil;

Я бы поменял их местами.

Несколько странно сперва уничтожать объект, а потом обращаться к его полям и методам...

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
13 часа назад, kami сказал:

Я бы поменял их местами.

Несколько странно сперва уничтожать объект, а потом обращаться к его полям и методам...

Учтём, благодарю 

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


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

Создайте аккаунт или войдите для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: 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
      В след за плюсами начали раздавать делфи стартер. Функционал урезан до жути, но возможно вам много и не нужно?
    • Автор: david_yusupov
      Cтолкнулся с не большой проблемой. Разрабатываю фрейм, использованием событие OnResize. Суть проблемы создаем динамически очень много объектов, и в зависимости от размера фрейма, обсчитываем положение и обновление размеры обетов.
      Приводит к зависанию всего приложения.
    • Автор: TrueCrypt
      Ахой, столкнулся с очередной проблемой Firemonkey, есть Frame, в нем ActionList, на Action есть Shortcut, но почему-то он никак не хочет отрабатывать. В ActionList главной формы Shortcut работают, а на фреймах — ни в какую.
      Кто сталкивался, как можно решить проблему?
    • Автор: Дениска
      Пустое приложение. У меня есть формы: А и 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);
    • Автор: Николай Ряполов
      Доброго дня.
      Решил попробовать начать работу с фреймами, но столкнулся со следующей ситуацией.
      При отображении фрейма на главной форме своевременно не отрисовываются события и перемещения курсора по компонентам фрейма.
      Фрейм добавляю с палитры компонентов.
      Плолучается примерно следующий вид:
         
      Как избавиться от этого?
    • Автор: 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 пользователей

    Нет пользователей, просматривающих эту страницу