Формы приложения могут быть модальными и немодальными.
Главной характерной особенностью модальной формы является то, что она приостанавливает выполнение вызвавшей ее процедуры до тех пор, пока пользователь ее не закроет. Кроме того модальная форма не позволяет пользователю переключить фокус курсором мыши на другие формы данного приложения, пока модальная форма не будет закрыта. В результате пользователь должен выполнить определенные действия, предлагаемые модальной формой, прежде чем сможет далее продолжить работу с приложением.
В качестве модальной могут выступать формы типа AboutBox, различного рода справочники и т.д. Разработчик приложения в зависимости от задач, которые должна решить форма, должен сам определить, будет она модальной или же немодальной.
Остановимся подробнее на модальной форме.
Поведение модальной формы определяется ее основным свойством ModalResult, доступным только во время выполнения. При открытии формы методом ShowModal свойство ModalResult=0. Как только в результате каких-либо определенных событий на форме свойству ModalResult будет присвоено положительное целое значение (в зависимости от версии C++ Builder) от 1 до 8 (для 5 версии) и до 10 (для 6 версии), модальная форма закроется и пользователь продолжит работу с приложением. Численные значения и константы им соответствующие можно посмотреть во встроенной справке C++ Builder.
Модальную форму можно создать и удалить в той же области действия, что гарантированно предотвратит утечку памяти. Для этого форма не должна создаваться автоматически. С этой целью необходимо удалить ее из списка AutoCreate Forms вкладки Forms диалогового окна Project --> Options. Затем из файла с расширением .cpp удаляется или комментируется строка:
TFormX * FormX;
а из файла с расширением .h удаляется или комментируется строка:
extern PACKAGE TFormX * FormX;
Для использования модальной формы создается следующая конструкция:
TFormX * FormX = new TFormX(0); try { FormX->ShowModal(); } __finally { delete FormX; }
Использование блока try/__finally гарантирует защищенность кода при возникновении исключительной ситуации, т.е. в случае исключительной ситуации форма будет удалена.
Не стоит применять код вида:
TFormX * FormX = new TFormX(0); FormX->ShowModal(); delete FormX;
Причина - если исключительная ситуация возникнет между событиями создания и удаления формы, то эта форма никогда не будет удалена. Также не стоит для удаления объекта библиотеки VCL использовать метод Free(). Лучше использовать метод delete, гарантированно вызывающий деструктор объекта и освобождающий память, выделенную оператором new.
Успехов Вам!
Автор:Доцу Виктор