Создание и разрушение Динамических форм в Дельфи
От: Аноним  
Дата: 27.05.10 09:13
Оценка: -2
Утечка памяти или Муки ООП


Сегодня утром столкнулся с совершенно неожиданным для меня результатом.

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: Создание и разрушение Динамических форм в Дельфи
От: DarkMaster Украина http://www.bdslib.at.ua
Дата: 27.05.10 09:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Закройте вторую форму. Владелец разрушен — сработало 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: Создание и разрушение Динамических форм в Дельфи
От: FilosOFF Россия  
Дата: 27.05.10 10:02
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Утечка памяти или Муки ООП



Думаецо что достаточно в первом обработчике написать следующее:

procedure TForm1.Button1Click(Sender: TObject);
begin
    if (self.Owner<>Self) then
                    ShowMessage('rtfm, rtfm, rtfm');
end;


Это секретный код для уменьшения мук.
... << RSDN@Home 1.2.0 alpha 4 rev. 1231>>
Re: Создание и разрушение Динамических форм в Дельфи
От: alex_mah Россия www.elsy.ru
Дата: 27.05.10 10:04
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>...


А>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: Создание и разрушение Динамических форм в Дельфи
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 27.05.10 10:09
Оценка:
Здравствуйте, Аноним, Вы писали:

Как все запутано...

А>Form2:= TForm2.Create(Form1.Owner);


Как я понял, у Form1 Owner это Application, значит у Form2 Owner тоже будет Application

А>Form3 := TForm3.Create(Form2.Owner); //Внимание. Вы видите как вторая форма рождает третью форму и становится ее владельцем.


Нет, я вижу, что Owner у Form3 и Owner и Form2 одинаковые. И судя по всему, это Application.
Re[2]: Создание и разрушение Динамических форм в Дельфи
От: FilosOFF Россия  
Дата: 27.05.10 10:09
Оценка: 1 (1)
Здравствуйте, 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]: Создание и разрушение Динамических форм в Дельфи
От: Nonmanual Worker  
Дата: 27.05.10 10:29
Оценка:
Здравствуйте, FilosOFF, Вы писали:

FOF>Хо-хо, я опередил тебя на две секунды Да не логическая ошибка, а тупое не знание и не желание читать документацию.

FOF>После таких постов и появляются утверждения что делфи программисты только и умеют, что кидать кнопки на формочки.

Еще и "с инициативой" (c).
Re[2]: Создание и разрушение Динамических форм в Дельфи
От: PsiMagistr  
Дата: 27.05.10 10:49
Оценка:
Здравствуйте, 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.



Благодарю за помощь ВСЕХ.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.