Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

"Модальное окно: блокировка только родительской формы в Delphi"

Delphi , Программа и Интерфейс , Модальные формы

Модальное окно: блокировка только родительской формы в Delphi

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

Проблема

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

procedure TfmMaterialsPlanning.CreateParams(var Params: TCreateParams);
begin
   inherited;
   // Создание новой кнопки в панели задач при создании этой формы
   Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;

Пользователь может открыть немодальную форму для управления 'Яблоками',另一种不模式窗体管理'Апельсины', и легко переключаться между ними с помощью панели задач. Однако, если открыть модальное окно из формы 'Яблоки' (например, для настройки параметров), то пользователь не сможет использовать форму 'Апельсины' до тех пор, пока не закроет модальное окно.

Решение

Одним из возможных решений является предотвращение принятия фокуса формой 'Яблоки' во время открытия дочернего модального окна. Для этого можно переопределить метод WindowProc родительской формы и обработать сообщение WM_SETFOCUS, как показано ниже:

type
  TfmApples = class(TForm)
    // Компоненты формы
  private
    { Private declarations }
    FModalForm: TForm;
  public
    { Public declarations }
    procedure WMSetFocus(var Msg: TWMSetFocus); message WM_SETFOCUS;
  end;

procedure TfmApples.WMSetFocus(var Msg: TWMSetFocus);
begin
  if Assigned(FModalForm) and FModalForm.ModalResult = mrNone then
    // Модальное окно все еще открыто, не принимаем фокус
    Msg.Result := 0
  else
    inherited;
end;

При открытии модального окна укажите его в поле FModalForm родительской формы и установите значение ModalResult в mrNone. При закрытии модального окна установите ModalResult в mrOk или mrCancel, и оно автоматически закроется, а родительская форма сможет принять фокус.

Подтвержденный ответ

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

Альтернативный ответ

Как альтернативное решение можно рассмотреть структурирование пользовательского интерфейса таким образом, чтобы минимизировать использование модальных окон. В руководстве "Диалоговые окна" по пользовательскому интерфейсу Windows приведены лучшие альтернативы для многих случаев использования модальных окон. Ограничение использования модальных окон может сделать ненужными формально-модальные окна.

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

Создано по материалам из источника по ссылке.

Описан ситуация в Delphi, где нужно сделать модальное окно, блокирующее только родительскую форму, а не все формы приложения. Для этого предлагается переопределить метод `WindowProc` родительской формы и обработать сообщение `WM_SETFOCUS`, чтобы предотвра


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Модальные формы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-23 12:26:02/0.0037369728088379/0