В современных приложениях, построенных с использованием Delphi, часто встречается необходимость в использовании диалоговых окон для ввода данных или отображения информации. Одним из удобных способов управления диалогами является использование метода ShowModal, который блокирует дальнейшую работу программы до тех пор, пока диалог не будет закрыт. Однако, такой подход может негативно сказаться на пользовательском опыте, особенно в приложениях, имеющих несколько модулей, работающих в различных вкладках основной формы.
В данной статье мы рассмотрим, как реализовать местно-модальные диалоги в приложении с несколькими модулями на Delphi. Местно-модальный диалог блокирует только текущий модуль, в котором он был открыт, позволяя пользователю свободно переключаться между другими модулями и продолжать работу в них. При возврате к модулю, в котором был открыт диалог, пользователь должен закрыть его, прежде чем продолжить работу в этом модуле.
Решение
Для реализации местно-модальных диалогов мы будем использовать базовый класс для всех диалогов TAttracsForm и добавим в него метод ShowLocalModal. Также нам понадобится класс-менеджер TViewManager, который будет отвечать за добавление, удаление и активацию модулей.
Добавьте в класс TViewManager два новых метода: LockCurrentView и UnLockCurrentView.
type
TChildTemplate = class(TForm)
// ...
end;
TViewManager = class
private
FCurrentView: TChildTemplate;
// ...
public
procedure LockCurrentView;
procedure UnLockCurrentView(aCallerForm: TChildTemplate);
// ...
end;
implementation
procedure TViewManager.LockCurrentView;
begin
Result := FCurrentView;
Result.Enabled := False;
Result.VMDeactivate; // Деактивировать меню и панель инструментов для этого модуля
end;
procedure TViewManager.UnLockCurrentView(aCallerForm: TChildTemplate);
begin
aCallerForm.VMActivate; // Активировать меню и панель инструментов для этого модуля
aCallerForm.Enabled := True;
end;
Переопределите метод FormClose в классе TAttracsForm и добавьте новый метод ShowLocalModal.
type
TAttracsForm = class(TForm)
private
FCallerForm: TChildTemplate;
FOnAfterDestruction: TNotifyEvent;
// ...
public
procedure FormClose(Sender: TObject; var Action: TCloseAction); override;
procedure ShowLocalModal(aNotifyAfterClose: TNotifyEvent);
// ...
end;
implementation
procedure TAttracsForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Assigned(FCallerForm) then
begin
ClientMainForm.ViewManager.UnLockCurrentView(FCallerForm as TChildTemplate);
if Assigned(FOnAfterDestruction) then
FOnAfterDestruction(Self);
Action := caFree;
end;
end;
procedure TAttracsForm.ShowLocalModal(aNotifyAfterClose: TNotifyEvent);
begin
FCallerForm := ClientMainForm.ViewManager.LockCurrentView; // Блокировать текущий модуль и вернуть его
PopupParent := FCallerForm;
FOnAfterDestruction := aNotifyAfterClose;
Show;
end;
В модулях, которые наследуются от TChildTemplate, вызывайте метод ShowLocalModal для отображения местно-модального диалога.
procedure TMyModule.Button1Click(Sender: TObject);
begin
with TAttracsForm.Create(nil) do
try
// Настройте диалог перед отображением
ShowLocalModal(
procedure()
begin
// Выполните действия после закрытия диалога
end);
finally
Free;
end;
end;
При таком подходе модуль, в котором был открыт диалог, блокируется до тех пор, пока пользователь не закроет его. При этом пользователь может свободно переключаться между другими модулями и продолжать работу в них. После закрытия диалога модуль разблокируется, и пользователь может продолжить работу в нем.
Заключение
позволяет существенно повысить удобство работы пользователя, обеспечивая блокировку только текущего модуля, в котором открыт диалог. Использование базового класса для диалогов и класса-менеджера модулей позволяет создать гибкую и легко расширяемую структуру для управления диалогами в приложении.
Реализация местно-модальных диалогов в приложении с несколькими модулями на Delphi позволяет блокировать только текущий модуль, в котором открыт диалог, обеспечивая свободу переключения между другими модулями.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.