С++ Builder: программно создаём и удаляем формы
Как известно, добавить в проект визуальной среды, такой как C++ Builder, новое программное окно (форму) - не проблема. Просто включаем её в проект через меню File, New, Form и управляем
отображением/скрытием формы через её свойство Visible
или с помощью стандартных методов Show()
и Hide()
класса TControl
.
Когда динамических форм в приложении становится много, может оказаться целесообразней не добавлять их все в проект, а создавать программно по мере необходимости, ведь TForm
- обычный класс, а значит, имеет конструктор:
TForm *f=new TForm (this); f->Caption="Новая форма"; f->Show();
Когда форма стала не нужна, можно удалить её обычным образом:
delete f;
Что делать, если форма должна быть единственной и требуется предотвратить создание второй такой же? Поможет следующая инструкция.
В классе главной формы глобально объявляем указатель на класс TForm
:
TForm *f0;
В заголовочном файле класса главной формы, из которой будет создаваться новая форма, объявляем прототип функции (в области public
):
void __fastcall TForm1::SetNull();
Описываем саму функцию в теле модуля:
void __fastcall TForm1::SetNull() { f0 = NULL; }
Пишем обработчик события OnClose
для создаваемой формы:
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { Form1->SetNull(); Action = caFree; }
Откуда-нибудь выполняем создание формы, установку обработчика и отображение окна:
if (!f0) { f0 = new TForm(this); f0->OnClose = Form1->FormClose; f0->Show(); } else { if (IsIconic(f0->Handle)) { f0->WindowState = wsNormal; } f0->SetFocus(); }
Таким образом, дубликат создан не будет, но после закрытия динамической формы можно будет снова создать один её экземпляр.
Скачать архив c примером в виде проекта C++ Builder (4 Кб)
Внимательный пользователь легко заметит, что в случае многократного динамического создания/удаления форм занимаемая приложением память может увеличиваться при создании, но не уменьшаться при закрытии формы, нормально ли это? Пожалуй, для масдая - да, ведь диспетчер задач показывает только использование виртуальной памяти процессом. Менеджер памяти считает лишним немедленный возврат небольшого количества памяти - это может привести лишь к снижению быстродействия. Соответствующий участок памяти в "куче" (heap) просто помечается как свободный и будет при случае повторно использован самим же приложением.
28.04.2013, 17:28 [23307 просмотров]