Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.08.2012, 10:47
Alexs55 Alexs55 вне форума
Прохожий
 
Регистрация: 11.07.2012
Сообщения: 14
Репутация: 10
По умолчанию Динамически созданные компоненты и массив компонентов

Доброго всем здравия

Требуется динамически создать несколько компонентов и объединить их в массив. В книгах и интернете нашел всё, что для этого необходимо сделать. НО.... (куда без него) вот здесь увидел такой код
Код:
pn := TPanel.Create(nil);
То есть у компонента нет владельца. Если у компонента есть владелец, то он (компонент) уничтожается одновременно с владельцем. В этом случае кто является владельцем и как происходит уничтожение динамически созданых компонентов при уничтожении формы. Может такие компоненты надо уничтожать вручную?
Ответить с цитированием
  #2  
Старый 16.08.2012, 10:49
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

у такого компонента владельца нет, соответственно его нужно удалять вручную. но если у нее есть родитель, то он ее удалит.
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 16.08.2012 в 10:54.
Ответить с цитированием
  #3  
Старый 16.08.2012, 10:52
Alexs55 Alexs55 вне форума
Прохожий
 
Регистрация: 11.07.2012
Сообщения: 14
Репутация: 10
По умолчанию

А назначить владельца после создания компонента возможно?
Ответить с цитированием
  #4  
Старый 16.08.2012, 11:04
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

нет. Owner только для чтения.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Alexs55 (16.08.2012)
  #5  
Старый 16.08.2012, 11:09
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Alexs55
А назначить владельца после создания компонента возможно?
Можно:
Код:
  Application.InsertComponent(pn);
  // или так
  Form1.InsertComponent(pn);
Только зачем? Если нужно создать компонент и забыть о его освобождении, то сразу указывают владельца. Если необходимо "ручное" удаление, то при создании указывают nil (и потом не забывают освобождать).
Ответить с цитированием
  #6  
Старый 16.08.2012, 11:26
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
InsertComponent
Oops, забыл)
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #7  
Старый 16.08.2012, 12:29
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от NumLock
Oops, забыл)
Ну по правде говоря InsertComponent слишком "низкоуревневая" операция и злоупотреблять ею не стоит (даже не знаю почему Borland сделал её как public, а не хотя бы как protected). В случае если компонентом уже владеет кто-то, то нужно не забывать старому владельцу делать RemoveComponent иначе у одного компонента будет несколько владельцев, каждый из которых впоследствии будут пытаться уничтожать его, что конечно приведёт к плохим последствиям. Вобщем за правило лучше взять: либо сразу при создании указывать владельца, либо при создании указывать nil и самому заботиться об уничтожении.
Ответить с цитированием
  #8  
Старый 16.08.2012, 12:38
Alexs55 Alexs55 вне форума
Прохожий
 
Регистрация: 11.07.2012
Сообщения: 14
Репутация: 10
По умолчанию

Спасибо за разъяснения. Осталась пару вопросов по данной теме. Так сказать "для повышения образованности" (почтальон Печкин). Без ответа жить буду, но всётаки..
1. Зачем нужны компоненты без владельца.
2. На форумах многие предлагают такой вариант:
Код:
pn := TPanel.Create(self);
Тоесть компонент владеет сам собой. Очень похоже на
Код:
pn := TPanel.Create(nil);
. Раз советуют - значит работает. Только вот на сколько это корректно.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:50.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025