В процессе работы с локальными модальными диалогами (LMD) может возникнуть ситуация, когда вам необходимо передать результат, полученный в диалоге, вызывающему методу. Поскольку вызов диалога является асинхронным с помощью Show(), просто получить результат после вызова невозможно.
В этой статье мы рассмотрим, как передать одно или несколько значений из метода TLMD_Dialog.btnOkClick в метод TModule.myEvent с помощью LMD.
У нас есть три единицы, участвующие в этом:
Module.pas
procedure TModule.btnCallDlg(Sender: TObject);
begin
if Supports(lhaHandle.CurrentBoldObject, IObject, vMyObject) then
TModalDialog.Execute(param1, param2, myEvent);
end;
procedure TModule.myEvent(Sender: TObject);
begin
// Некий код, который реагирует на результат LMD-диалога
end;
AttracsForm.pas
type
TAttracsForm = class(TForm)
...
published
procedure ShowLocalModal(aNotifyAfterClose: TNotifyEvent=nil);
end;
...
procedure TAttracsForm.ShowLocalModal(aNotifyAfterClose: TNotifyEvent);
begin
fCallerForm := ClientMainForm.ViewManager.LockCurrentView;
PopupParent := fCallerForm;
OnAfterDestruction := aNotifyAfterClose;
Show;
end;
LMD_Dialog.pas (наследуется от TAttracsForm)
class procedure TLMD_Dialog.Execute(aParam: IBoldObject; aNotifyEvent: TNotifyEvent);
begin
with Self.Create(nil) do
begin
// Некий код подготовки
ShowLocalModal(aNotifyEvent);
end;
end;
procedure TLMD_Dialog.btnOkClick(Sender: TObject);
begin
// Некий код перед закрытием
// Устанавливаем результат диалога
Close;
end;
Чтобы передать результат из диалога в вызывающий метод, мы можем использовать кастомный тип события вместо TNotifyEvent. Вот пример, как это можно сделать:
LMD_Dialog.pas
type
TReturnDialogDataEvent = procedure(Sender: TObject; const AResult: string; AAdditionalParam: Integer) of object;
procedure TLMD_Dialog.btnOkClick(Sender: TObject);
begin
// Некий код перед закрытием
// Устанавливаем результат диалога
Close;
if Assigned(OnReturnDialogData) then
OnReturnDialogData(Self, 'Результат диалога', 123);
end;
Затем в методе TModule.myEvent мы можем обработать это событие:
Module.pas
procedure TModule.btnCallDlg(Sender: TObject);
begin
if Supports(lhaHandle.CurrentBoldObject, IObject, vMyObject) then
begin
TModalDialog.Execute(param1, param2, procedure(Sender: TObject)
begin
myEvent(Sender);
end);
end;
end;
procedure TModule.myEvent(Sender: TObject);
begin
if Sender is TLMD_Dialog then
begin
var dlg := Sender as TLMD_Dialog;
if Assigned(dlg.OnReturnDialogData) then
begin
dlg.OnReturnDialogData := procedure(Sender: TObject; const AResult: string; AAdditionalParam: Integer)
begin
// Некий код, который реагирует на результат LMD-диалога
// Например, вы можете вывести результат в консоль:
Writeln('Результат диалога: ', AResult, ', Дополнительный параметр: ', AAdditionalParam);
end;
dlg.ShowLocalModal(nil);
end;
end;
end;
Теперь, когда пользователь нажимает кнопку "ОК" в диалоге, результат и дополнительный параметр передаются в метод TModule.myEvent, где их можно обработать.
В описанной ситуации необходимо передать результат, полученный в диалоге, в вызывающий метод, учитывая, что вызов диалога является асинхронным.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.