Сегодня утром столкнулся с совершенно неожиданным для меня результатом.
1) Создайте проект.
2) Добавьте в проект еще две формы.
Итого у нас Form1, Form2, Form3.
3) Отключите автосоздание Form2 и Form3. Свойство Visible обеих форм сделайте равным True.
Автосоздаваться у нас будет только одна форма (Form1) Остальные будем создавать динамически.
4) Откройте окно кода Form1 Подключите к модулю Form1 модуль Form2 Для этого после ключевого слова implementation добавьте:
uses Unit2;
На форме Form1 нарисуйте кнопку. Смените ее Caption на "Создать окно". Запишите в обработчик щелчка:
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2:= TForm2.Create(Form1.Owner);
end;
Мы динамически создаем Form2
Теперь перейдите в код Form2. Добавьте после раздела implementation модуль третей формы:
uses Unit3;
В обработчике Close запишите:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree; //Разрушение формы-объекта при закрытии.
end;
На форму Form2 добавьте кнопку. Смените ее Caption на "Создание второй формы".
Запишите в обработчик OnClick;
procedure TForm2.Button1Click(Sender: TObject);
begin
Form3 := TForm3.Create(Form2.Owner); //Внимание. Вы видите как вторая форма рождает третью форму и становится ее владельцем.
end;
Добавьте в обработчик Close третьей формы:
procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:= caFree;
end;
Запустите программу. Нажмите на кнопку. Породите вторую форму. Нажмите на кнопку второй формы и от второй породите третью...
Итак третья форма рождена от второй Вторая является ее владельцем. НО...
Закройте вторую форму. Владелец разрушен — сработало caFree обработчика-закрытия.
Вот только третья форма дочерняя осталась на экране. Ай как не хорошо. Ай плохо-плохо.... Как же так??? Ведь по идее она должна разрушиться...
Re: Создание и разрушение Динамических форм в Дельфи
Здравствуйте, Аноним, Вы писали:
А>Закройте вторую форму. Владелец разрушен — сработало caFree обработчика-закрытия. А>Вот только третья форма дочерняя осталась на экране. Ай как не хорошо. Ай плохо-плохо.... Как же так??? Ведь по идее она должна разрушиться...
Давай не будем изобретать велосипеды и кричать о том, что ты обнаружил что-то новое. Кто тебе сказал, что форма должна разрушится при разрушении владельца?
Обрати внимание на :
1) Можно в качестве владельца отдать NIL — что разрушать-то будем?
2) Владельца можно в любой момент сменить (кстати, глянь, что у твоей третьей формы стало в поле Parent при разрушении второй).
WBR, Dmitry Beloshistov AKA [-=BDS=-]
Re[2]: Создание и разрушение Динамических форм в Дельфи
От:
Аноним
Дата:
27.05.10 09:42
Оценка:
Здравствуйте, DarkMaster, Вы писали:
DM>Здравствуйте, Аноним, Вы писали:
А>>Закройте вторую форму. Владелец разрушен — сработало caFree обработчика-закрытия. А>>Вот только третья форма дочерняя осталась на экране. Ай как не хорошо. Ай плохо-плохо.... Как же так??? Ведь по идее она должна разрушиться...
DM>Давай не будем изобретать велосипеды и кричать о том, что ты обнаружил что-то новое. Кто тебе сказал, что форма должна разрушится при разрушении владельца?
DM>Обрати внимание на : DM>1) Можно в качестве владельца отдать NIL — что разрушать-то будем? DM>2) Владельца можно в любой момент сменить (кстати, глянь, что у твоей третьей формы стало в поле Parent при разрушении второй).
Огромное-преогромное спасибо, за то что присоединились.
Ну при разрушении владельца, насколько я понимаю дочерние формы должны самоликвидироваться. В этом одно из его назначений. Нет владельца — нет и дочерних компонентов. Иначе пришлось бы всюду использовать вручную Free, контролируя разрушение самостоятельно.
Re: Создание и разрушение Динамических форм в Дельфи
Здравствуйте, Аноним, Вы писали:
А>...
А>procedure TForm1.Button1Click(Sender: TObject); А>begin А>Form2:= TForm2.Create(Form1.Owner); А>end;
А>...
А>procedure TForm2.Button1Click(Sender: TObject); А>begin А>Form3 := TForm3.Create(Form2.Owner); //Внимание. Вы видите как вторая форма рождает третью форму и становится ее владельцем. А>end;
А>...
По твоему коду владельцем третьей формы является владелец второй формы, он же владелец первой формы.
Поскольку с убийством формы 2 с ее владельцем ничего не происходит, то и форма 3 остается существовать без проблем.
В твоих рассуждениях логическая ошибка.
Re: Создание и разрушение Динамических форм в Дельфи
Как все запутано...
А>Form2:= TForm2.Create(Form1.Owner);
Как я понял, у Form1 Owner это Application, значит у Form2 Owner тоже будет Application
А>Form3 := TForm3.Create(Form2.Owner); //Внимание. Вы видите как вторая форма рождает третью форму и становится ее владельцем.
Нет, я вижу, что Owner у Form3 и Owner и Form2 одинаковые. И судя по всему, это Application.
Re[2]: Создание и разрушение Динамических форм в Дельфи
Здравствуйте, alex_mah, Вы писали:
_>Здравствуйте, Аноним, Вы писали:
А>>...
А>>procedure TForm1.Button1Click(Sender: TObject); А>>begin А>>Form2:= TForm2.Create(Form1.Owner); А>>end;
А>>...
А>>procedure TForm2.Button1Click(Sender: TObject); А>>begin А>>Form3 := TForm3.Create(Form2.Owner); //Внимание. Вы видите как вторая форма рождает третью форму и становится ее владельцем. А>>end;
А>>...
_>По твоему коду владельцем третьей формы является владелец второй формы, он же владелец первой формы. _>Поскольку с убийством формы 2 с ее владельцем ничего не происходит, то и форма 3 остается существовать без проблем.
_>В твоих рассуждениях логическая ошибка.
Хо-хо, я опередил тебя на две секунды Да не логическая ошибка, а тупое не знание и не желание читать документацию.
После таких постов и появляются утверждения что делфи программисты только и умеют, что кидать кнопки на формочки.
... << RSDN@Home 1.2.0 alpha 4 rev. 1231>>
Re[3]: Создание и разрушение Динамических форм в Дельфи
Здравствуйте, FilosOFF, Вы писали:
FOF>Хо-хо, я опередил тебя на две секунды Да не логическая ошибка, а тупое не знание и не желание читать документацию. FOF>После таких постов и появляются утверждения что делфи программисты только и умеют, что кидать кнопки на формочки.
Еще и "с инициативой" (c).
Re[2]: Создание и разрушение Динамических форм в Дельфи
Здравствуйте, Mystic, Вы писали:
M>Здравствуйте, Аноним, Вы писали:
M>Как все запутано...
А>>Form2:= TForm2.Create(Form1.Owner);
M>Как я понял, у Form1 Owner это Application, значит у Form2 Owner тоже будет Application
А>>Form3 := TForm3.Create(Form2.Owner); //Внимание. Вы видите как вторая форма рождает третью форму и становится ее владельцем.
M>Нет, я вижу, что Owner у Form3 и Owner и Form2 одинаковые. И судя по всему, это Application.