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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.10.2017, 20:29   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
Вопрос Динамическое создание формы с разными владельцами

Доброго времени суток!
Код:
Form1 := TForm1.Create(Application);
Form1 := TForm1.Create(Self);
Form1 := TForm1.Create(nil);
Скажите, пожалуйста, что дадут форме указанные выше владельцы, как она себя будет вести, и самое главное, для какого случая какого указывать владельца форме?
Shouldercannon вне форума Ответить с цитированием
Старый 14.10.2017, 20:37   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

При уничтожении владельца уничтожится и форма. Только и всего
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.10.2017, 20:44   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
По умолчанию

Получается, если я так
Код:
Form1 := TForm1.Create(Application);
создам 10 форм и потом их все закрою, то ни будут висеть в памяти пока не будет закрыта вся программа?

А если буду создавать так
Код:
Form1 := TForm1.Create(Self);
то формы буду сами уничтожаться при закрытии?

А это по ходу лучше вообще не использовать
Код:
Form1 := TForm1.Create(nil);
Shouldercannon вне форума Ответить с цитированием
Старый 14.10.2017, 21:03   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Делаешь в OnClose формы
Код:
  Action:=caFree;
и память освободится после закрытия формы. Модальную самостоятельно освобождай после ShowModal
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.10.2017, 01:25   #5
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
При уничтожении владельца уничтожится и форма. Только и всего
А как же список Components? Или вы им никогда не пользуетесь по религиозным соображениям?

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
Form1 := TForm1.Create(Self);
Понимаете ли вы, кто в этом случае будет владельцем данной формы?
northener вне форума Ответить с цитированием
Старый 15.10.2017, 07:44   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
А как же список Components? Или вы им никогда не пользуетесь по религиозным соображениям?
Пользуюсь иногда. ТС интересовало, что даст форме владелец, а не то, что даст владельцу форма ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.10.2017, 02:12   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Ну тогда я добавлю свои две копейки.
Create(Application); используется в стандартном шаблоне создаваемом Дельфи. В этом стандартном шаблоне он ни чем не лучше и ни чем не хуже Create(nil);
Во всяком случае на версиях Windows старше Win3.11
Create(nil); как раз очень часто используется многими авторами при создании временных форм типа
Код:
with TMyForm.Create(nil) do try
  ...
finally
  Free;
А по поводу варианта
Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
Create(Self)
жду хоть какой-то реакции ТС на мой вопрос #5.
northener вне форума Ответить с цитированием
Старый 16.10.2017, 06:30   #8
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Ну тогда я добавлю свои две копейки.
Create(Application); используется в стандартном шаблоне создаваемом Дельфи. В этом стандартном шаблоне он ни чем не лучше и ни чем не хуже Create(nil);
Во всяком случае на версиях Windows старше Win3.11
Create(nil); как раз очень часто используется многими авторами при создании временных форм типа
Код:
with TMyForm.Create(nil) do try
  ...
finally
  Free;
А по поводу варианта

жду хоть какой-то реакции ТС на мой вопрос #5.
Сама форма естественно
Shouldercannon вне форума Ответить с цитированием
Старый 16.10.2017, 07:50   #9
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
жду хоть какой-то реакции ТС на мой вопрос #5.
Мне кажется, Вы этим вопросом сами себя запутали. Дело ведь в том, где именно происходит конструирование формы: в методе самой формы или в методе порождающей формы (что встречается гораздо чаще). Во втором случае возникнет вполне нормальная связь предок-потомок.
Black Fregat вне форума Ответить с цитированием
Старый 17.10.2017, 01:24   #10
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
Сама форма естественно
Вот это как раз и ошибка. Впрочем скорее порожденная учебой на всемирной помойке, а не по учебникам.
Форма не может быть владельцем самой себя! Как впрочем и любой другой компонент! Она либо имеет владельцем другой компонент, либо не имеет владельца вообще (TMyForm.Create(nil)).
Зарезервированное слово Self означает неявный параметр, который передаётся в любой метод любого класса и содержит ссылку/указатель на конкретный экземпляр этого класса, в котором и был вызван данный метод.
Т.е. предположим что у вас есть форма класса TForm1. На ней есть кнопка Button1 : TButton;
И есть обработчик нажатия этой кнопки:
Код:
procedure TForm1.Button1Click(Sender: Tobject);
begin
  with TSomeForm.Create(Self) do
    ...
  end;
end;
Так вот ваша форма класса TSomeForm будет иметь владельцем экземпляр класса TForm1, в котором была нажата кнопка Button1.


P.S.
Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Мне кажется, Вы этим вопросом сами себя запутали.
Black Fregat, вам по прежнему кажется, что я сам себя запутал?
northener вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое создание формы NaumOff Общие вопросы Delphi 2 17.09.2012 18:52
динамическое создание формы Wi1D Общие вопросы Delphi 2 24.01.2011 01:03
Динамическое создание формы BoT_T Win Api 4 10.12.2010 12:36
Динамическое создание формы. Son Общие вопросы Delphi 1 04.02.2009 15:33
Динамическое создание формы Rifler Общие вопросы Delphi 6 11.09.2008 20:50