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

Как передать значения из `TLMD_Dialog.btnOkClick` в `TModule.myEvent` с помощью LMD

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

В процессе работы с локальными модальными диалогами (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




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


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


реклама


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

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