Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.10.2011, 00:39   #1
Хамяг
Форумчанин
 
Аватар для Хамяг
 
Регистрация: 22.08.2008
Сообщений: 105
По умолчанию нужно ли уничтожать динамические объектов типа TButton, TMemo и т.д.?

Код:
var
  Btn: TButton;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  Btn:=TButton.Create(Self);
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  Btn.Free;
end;
добрый вечер.
появился у меня такой вопрос: если при создании формы создать объект типа TButton, то нужно ли его уничтожать при уничтожении формы?
форма создаётся 1 раз при запуске программы, после уничтожения формы программа закрывается.
ну и для случая, когда форма создаётся динамически, и не один раз, тоже неплохо бы услышать ответ.

P.S. такой вопрос я решил задать потому что если объекты созданы статически (с помощью "перетащил кнопку на форму"), то их уничтожать не надо, к тому же у конструктора Create есть параметр.

Последний раз редактировалось mihali4; 24.10.2011 в 03:20.
Хамяг вне форума Ответить с цитированием
Старый 24.10.2011, 00:46   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Так как вы создали не надо (параметр Self метода Create). Когда форма будет уничтожаться, буттон тоже уничтожится.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.10.2011, 01:03   #3
Хамяг
Форумчанин
 
Аватар для Хамяг
 
Регистрация: 22.08.2008
Сообщений: 105
По умолчанию

Код:
procedure TComponent.DestroyComponents;
var
  Instance: TComponent;
begin
  FreeAndNil(FSortedComponents);
  while FComponents <> nil do
  begin
    Instance := FComponents.Last;
    if (csFreeNotification in Instance.FComponentState)
      or (FComponentState * [csDesigning, csInline] = [csDesigning, csInline]) then
      RemoveComponent(Instance)
    else
      Remove(Instance);
    Instance.Destroy;
  end;
end;
Аватар, и правда, сам уничтожается. спасибо .
Хамяг вне форума Ответить с цитированием
Старый 24.10.2011, 02:26   #4
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

Цитата:
добрый вечер.

появился у меня такой вопрос: если при создании формы создать объект типа TButton, то нужно ли его уничтожать при уничтожении формы?

форма создаётся 1 раз при запуске программы, после уничтожения формы программа закрывается.

ну и для случая, когда форма создаётся динамически, и не один раз, тоже неплохо бы услышать ответ.

P.S. такой вопрос я решил задать потому что если объекты созданы статически (с помощью "перетащил кнопку на форму"), то их уничтожать не надо, к тому же у конструктора Create есть параметр.
различают 3 типа объектов:

1) TObject - не имеет владельца, уничтожается вручную

TObject.Create;
TObject.free;

2) TComponent - имеет владельца, нигде неотображается.
уничтожается сразу после уничтожения своего владельца.

Код:
var c: TComponent;
begin
c:=TComponent.Create(ownerComponent);
ownerComponent.Destroy;
c <<- уничтожен
3) TControl - имеет владельца и компонент - контейнерОтображения, где происходит отрисовка

Код:
var b1,b2: TButton; // TButton - наследник TControl
begin
b1:=TButton.Create(Form1); // форма - владелец
b1.Parent:=Form1; // место отрисовки - Form1
b2:=TButton.Create(b1); // кнопка b2 принадлежит b1
b2.Parent:=Form1; // место отрисовки - Form1 

b1.Destroy; // уничтожены b2,b1
Lesha вне форума Ответить с цитированием
Старый 24.10.2011, 02:52   #5
Хамяг
Форумчанин
 
Аватар для Хамяг
 
Регистрация: 22.08.2008
Сообщений: 105
По умолчанию

Lesha, я об этом не спрашивал, но всё равно, спасибо, не мне, так другим полезно будет .
Хамяг вне форума Ответить с цитированием
Старый 24.10.2011, 02:55   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
2) TComponent - имеет владельца, нигде неотображается.
если имеет владельца то не обязательно уничтожать руками.(к низшим по иерархии тоже самое)
но можно уничтожить раньше если надо.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с объектами типа вектор, в каждом классе должны быть методы сохранения и загрузки объектов mavar Помощь студентам 0 03.05.2011 16:35
Динамические массивы объектов, проблема с перекрестной индексацией. Василиск Общие вопросы Delphi 16 25.01.2011 00:30
Создание массива объектов типа Label levandowskiy Общие вопросы C/C++ 3 21.12.2010 15:20
компонент типа tmemo motaro Общие вопросы Delphi 7 29.08.2009 12:54