C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Динамическое создание/удаление форм, как правильней ?
Guest
Отправлено: 21.06.2005, 19:38


Не зарегистрирован







Какая разница между созданием формы:
CODE
Application->CreateForm(__classid(TFMyForm), &FMyForm);

и
CODE
TFMyForm* FMyForm = new TFMyForm(this);

то есть между тем как это делает сам C++Builder и
как это можно делать нам.

И как правильней самому динамически создавать формы,
когда форма готова и размещена в
ProjectOptions->Forms->Available forms

Также попутно второй вопрос:
как правильно удалять динамически созданную форму
(находящуюся в списке Available forms) :
то есть — есть ли разница, установить форме при закрытии
Action = caFree;

CODE

void __fastcall TFMyForm::FormClose(TObject *Sender, TCloseAction &Action)
{
        Action = caFree;    // вот так
}


или сделать так:
CODE

TFMyForm* FMyForm = new TFMyForm(this);
FMyForm->ShowModal();
delete FMyForm;             // или вот так

Guest
Отправлено: 23.06.2005, 22:33


Не зарегистрирован







Так никто не знает ответа ?
olegenty
Отправлено: 24.06.2005, 07:23


Ветеран

Группа: Модератор
Сообщений: 2412



разница в том, что при
CODE

Application->CreateForm(__classid(TFMyForm), &FMyForm);

Owner'ом формы будет глобальный экземпляр TApplication,
а в случае
CODE

TFMyForm* FMyForm = new TFMyForm(this);

Owner'ом будет то, чем является this

а правильное удаление вообще зависит скорее от твоей прикладной логики, чем от чего-то ещё. например, выставил ты
CODE

Action = caFree;  

а тебе надо ещё что-то от формы получить после её закрытия. тогда так делать просто нелогично, поработаешь, да и delete её. а в случае, например, когда это MDI Child окно — в самый раз.
Guest
Отправлено: 24.06.2005, 09:15


Не зарегистрирован







А в случае, если форма нормальная (не child), а открывается как модальная и возвращает значение:
CODE
int n = MyForm->ShowModal();

если на событие закрытия этой формы стоит Action = caFree;
CODE

void __fastcall TFMyForm::FormClose(TObject *Sender, TCloseAction &Action)
{
    Action = caFree;
}

произойдет ли корректный возврат результата,
или могут быть AccessViolation по доступу
к уже уничтоженной форме ?
Gedeon
Отправлено: 24.06.2005, 09:41


Ветеран

Группа: Модератор
Сообщений: 1742



>> А в случае, если форма нормальная (не child) если на событие
>> закрытия этой формы стоит Action = caFree произойдет ли
>> корректный возврат результата

Да.
Sl@Sh
Отправлено: 29.06.2005, 10:47


Мастер участка

Группа: Участник
Сообщений: 383



Я вообще если форму нужно создать динамически а потом удалить использую new delete, при этом в .срр удаляю TForm1 *Form1, а в *.н такое же с extern.

На это всё меня надоумила книжка Архангельского. Там именно так и рекомендуется динамически модальную форму использовать.

Вернуться в Вопросы программирования в C++Builder