Форум по 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:33
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Вообще-то InsertComponent проверяет наличие владельца.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

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

Спасибо за разъяснения. Осталась пару вопросов по данной теме. Так сказать "для повышения образованности" (почтальон Печкин). Без ответа жить буду, но всётаки..
1. Зачем нужны компоненты без владельца.
2. На форумах многие предлагают такой вариант:
Код:
pn := TPanel.Create(self);
Тоесть компонент владеет сам собой. Очень похоже на
Код:
pn := TPanel.Create(nil);
. Раз советуют - значит работает. Только вот на сколько это корректно.
Ответить с цитированием
  #10  
Старый 16.08.2012, 12:52
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

1. Невизуальным компонентам владелец не обязателен. Я, например, частенько TADOQuery создаю внутри фуункций для того чтобы заврос к БД делать.
2. Self - это не панель, это компонент внутри метода которого ты описываешь создание панели. Это корректно.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

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

Прошу прощенья, вопрос криво задал (за мной такое водится). Ну и получил.... Попробую по другому задать вопрос:
2. Если компонент создан ... .Create(self);, то кто будет являться его владельцем?
Ответить с цитированием
  #12  
Старый 16.08.2012, 13:17
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Aristarh Dark
Вообще-то InsertComponent проверяет наличие владельца.
В какой версии Delphi? У меня в Delphi 7 не проверяет:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  pn, pn2, pn3: TPanel;
begin
  pn:=TPanel.Create(nil);

  pn2:=TPanel.Create(nil);
  pn3:=TPanel.Create(nil);

  pn2.InsertComponent(pn);
  pn3.InsertComponent(pn);

  pn2.Free;
  pn3.Free;
end;
Выдаёт ошибку: Access violation at address 00000000. Read of address 00000000.
Ответить с цитированием
  #13  
Старый 16.08.2012, 13:20
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Alexs55
Прошу прощенья, вопрос криво задал (за мной такое водится). Ну и получил.... Попробую по другому задать вопрос:
2. Если компонент создан ... .Create(self);, то кто будет являться его владельцем?
В методе какого компонента этот Create(self) был вызван, тот и будет владельцем.
Ответить с цитированием
  #14  
Старый 16.08.2012, 13:26
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

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

Цитата:
Сообщение от NumLock
ну только Self ссылка на объект в методе которого он используется. это не только к компонентам применимо. а InsertComponent действительно не нужен, иначе я бы про него не забыл)))
Self понятно, что можно использовать в методе любого класса, но владельцем может быть только TComponent и его наследники (т.е. только компоненты). Если же вызвать .Create(self); в методе класса который не является компонентом, то это уже не сделает его владельцем вновь созданного компонента, а будет что-то совсем другое. В вопросе же было: "Если компонент создан ... .Create(self);, то кто будет являться его владельцем?"
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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