Модальные формы в Delphi

Модальной называется форма, которая должна быть закрыта перед обращением к любой другой форме данного приложения. Если пользователь пытается перейти в другую форму, не закрыв текущую модальную форму, Windows блокирует эту попытку и выдает предупреждающий сигнал. Запрет перехода в другую форму при незакрытой модальной форме относится только к текущему приложению, так что пользователь может активизировать любое другое приложение Windows.

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

Модальные формы часто называют диалоговыми формами (окнами), или диалоговыми панелями, хотя существуют и немодальные диалоговые окна. Для выполнения различных операций в Windows часто используются стандартные диалоговые формы, с которыми пользователь имеет дело при работе с приложениями. Такие формы называются общими, или стандартными диалоговыми окнами, для работы с ними Delphi предлагает специальные компоненты. Мы рассмотрим их в другой статье.

Типичным примером модальной диалоговой формы системы Delphi является диалоговое окно About Delphi (см. скриншот).



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

Метод ShowModal

Для отображения формы в модальном режиме служит метод ShowModal.

  1. procedure TForm1.mnuAboutClick(Sender: TObject);
  2. begin
  3. fmAbout.ShowModal;
  4. end;

Выполнение вышеуказанной процедуры (путем выбора пункта меню mnuAbout), приводит к отображению формы fmAbout в модальном режиме. Пункт меню может иметь заголовок (например, О программе), задаваемый в свойстве Caption. Пользователь может продолжить работу с приложением, только закрыв эту модальную форму.

Многие формы можно отображать и в немодальном режиме, например, так:

Напомним, что метод Show является процедурой, т. е. не возвращает результат.

При закрытии модальной формы функция ShowModal возвращает значение свойства ModalResult типа TModalResult. Возможные значения этого свойства рассмотрим в следующих статьях.

Вообще говоря, код результата при закрытии возвращает любая форма. В данном случае его можно использовать для организации ветвления: возвращаемый после закрытия диалогового окна код результата анализируется и в зависимости от значения выполняются те или иные действия.

В качестве примера рассмотрим, как происходит управление диалоговой формой в реальном приложении.

  1. // Процедура находится в модуле формы Form1
  2. procedure TForm1.btnDialogClick(Sender: TObject);
  3. var
  4. rez :TModalResult;
  5. begin
  6. rez := fmDialog.ShowModal;
  7. if rez = mrOK then MessageDlg('Диалог принят.', mtInformation, [mbYes], 0);
  8. if rez = mrCancel then MessageDlg('Диалог отменен.', mtInformation, [mbYes], 0);
  9. end;
  10. // Процедуры находятся в модуле формы fmDialog
  11. // Закрытие формы и установка кода результата в значение mrOK
  12. procedure TfmDialog.btnCloseClick(Sender: TObject);
  13. begin
  14. // Порядок инструкций изменять нельзя
  15. Close;
  16. ModalResult : = mrOK;
  17. end;
  18. // Закрытие формы и установка кода результата в значение mrCancel
  19. procedure TfmDialog.btnCancelClick(Sender: TObject);
  20. begin
  21. // Порядок инструкций изменять нельзя
  22. Close;
  23. ModalResult := mrCancel;

Кнопка btnDialog формы Form1 открывает диалоговую форму fmDialog. После закрытия диалогового окна кнопкой btnClose или btnCancel анализируется возвращенный код результата и выполняется вывод сообщения на экран.

Как правило, управление кодом результата диалога выполняется не программно (через свойство ModalResult формы), а с помощью кнопок. Чаще всего диалоговая форма содержит кнопки подтверждения и отмены выполненных операций. Кнопка подтверждения диалога в зависимости от назначения может называться по-разному, например: ОК, Ввод, Открыть, Yes. Кнопка отмены диалога часто называется Отмена или Cancel.

Как отмечалось, закрыть форму можно, используя свойство ModalResult кнопки. Если свойство имеет значение, отличное от mrNone, то при нажатии кнопки форма автоматически закрывается. При закрытии в качестве результата форма возвращает значение, определяемое свойством ModalResult кнопки, закрывшей эту форму.

Рассмотрим в качестве примера следующую процедуру:

  1. procedure TfmDialog.FormCreate(Sender: TObject);
  2. begin
  3. fmDialog.BorderStyle := bsDialog;
  4. btnOK.Caption := 'OK';
  5. btnOK.Default := True;
  6. btnOK.ModalResult := mrOK;
  7. btnCancel.Caption := 'Отмена';
  8. btnCancel.Cancel := True;
  9. btnCancel.ModalResult := mrCancel;
  10. end;

В вышеуказанной процедуре устанавливаются значения свойств кнопки btnOK подтверждения и кнопки btnCancel отмены диалога fmDialog. При нажатии любой из них форма автоматически закрывается (без выполнения обработчиков события нажатия кнопок) и возвращает соответствующий результат.

Напомним, что обычно свойства кнопок и самой модальной формы задаются в окне Инспектора объектов при проектировании приложения. В приведенном примере для наглядности некоторые свойства устанавливаются в обработчике события onCreate формы.

При закрытии формы методом Close всегда возвращается значение mrCancel ее свойства ModalResult. Скрытие формы методом Hide не изменяет значение свойства ModalResult.

В принципе разработчик может самостоятельно создать любую модальную форму, однако стоит сказать, что для выполнения типовых действий Delphi предлагает ряд предопределенных диалоговых окон. Наиболее простые диалоговые окна реализуются с помощью специальных процедур и функций, в более общих случаях удобно использовать специальные компоненты — стандартные диалоговые окна. Кроме того, ряд диалоговых форм расположен на странице Dialogs в Хранилище объектов.

Метки: ,
Если Вам интересна эта запись, Вы можете следить за ее обсуждением, подписавшись на RSS 2.0 .

Оставить комментарий или два

*