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

Повышение приоритета модальных форм в приложении на Delphi

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

Улучшение приоритета модальных форм в приложении на Delphi

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

Причина проблемы

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

Пример

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

type
  TBigForm = class(TForm)
  strict private
    OnTopForm: TForm;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  protected
    procedure DoHide; override;
    procedure DoShow; override;
  public
    constructor Create(AOwner: TComponent); override;
  end;

{ TBigForm }

procedure TBigForm.Button1Click(Sender: TObject);
begin
  ShowMessage('Test');
end;

constructor TBigForm.Create(AOwner: TComponent);
begin
  inherited CreateNew(AOwner);

  Caption := 'Big form';
  WindowState := wsMaximized;

  Button1 := TButton.Create(Self);
  Button1.Parent := Self;
  Button1.Caption := 'Freeze!';
  Button1.SetBounds(10, 10, 100, 100);
  Button1.OnClick := Button1Click;
end;

procedure TBigForm.DoHide;
begin
  OnTopForm.Free;
  inherited DoHide;
end;

procedure TBigForm.DoShow;
begin
  inherited DoShow;
  OnTopForm := TForm.Create(Self);
  OnTopForm.Caption := 'Important information';
  OnTopForm.BorderStyle := bsToolWindow;
  OnTopForm.FormStyle := fsStayOnTop;
  OnTopForm.Position := poScreenCenter;
  OnTopForm.Show;
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  f: TBigForm;
begin
  f := TBigForm.Create(nil);
  try
    f.ShowModal;
  finally
    f.Free;
  end;
end;

Запустите приложение, нажмите на "Button1" и затем на "Freeze!". Модальное окно "Test" может оказаться скрытым за формой "Important information".

Решение проблемы

Для решения этой проблемы можно временно менять флаг FormStyle формы с флагом fsStayOnTop перед отображением другой формы модально. Пример кода, который решает эту проблему:

procedure TBigForm.Button1Click(Sender: TObject);
begin
  OnTopForm.FormStyle := fsNormal;
  ShowMessage('Test');
  OnTopForm.FormStyle := fsStayOnTop;
end;

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

Альтернативное решение

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

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnModalBegin := ApplicationModalBegin;
end;

procedure ApplicationModalBegin(Var ModalForm: TForm);
begin
  ModalForm.WindowState := wsNormal;
  ModalForm.BringToFront;
end;

В этом примере мы регистрируем обработчик события OnModalBegin в методе FormCreate формы. При вызове модальной формы обработчик меняет состояние окна модальной формы на wsNormal и привносит ее на передний план, тем самым решает проблему.

Заключение

В этой статье мы рассмотрели проблему с модальными формами, скрываемыми формами с флагом fsStayOnTop, и предложили два решения: временное изменение флага FormStyle и использование события OnModalBegin приложения. Вы можете выбрать подход, который лучше всего подходит для вашего приложения.

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

Улучшение приоритета модальных форм в приложении на Delphi: временное изменение флага FormStyle или использование события OnModalBegin для предотвращения сокрытия модальных форм за формами с флагом fsStayOnTop.


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

Получайте свежие новости и обновления по 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:24:12/0.0057649612426758/1