БлогNot. С++ Builder: программно создаём и удаляем формы

С++ 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 [22808 просмотров]


теги: программирование windows c++ builder

К этой статье пока нет комментариев, Ваш будет первым