Получение данных из модальных форм до их закрытия - PullRequest
8 голосов
/ 19 октября 2011

У меня есть модальная форма, и в кнопке Ok она обрабатывает некоторую информацию, которая мне нужна, в форме, которая называется модальной формой.

Как я могу получить его до того, как он закроется?

Или отложите закрытие, пока я не скажу, что оно может закрыться.

Ответы [ 6 ]

11 голосов
/ 19 октября 2011

Я ожидаю, что для вашей кнопки ОК ModalResult установлено на mrOK. Если вы хотите добавить проверку ошибок к кнопке ОК, измените ее на mrNone. Добавьте обработчик OnClick к кнопке, который выполняет любую проверку или обработку, в которой вы нуждаетесь. Если он определяет, что форма может закрыться, установите Self.ModalResult := mrOK в обработчике OnClick.

7 голосов
/ 19 октября 2011

Вам действительно нужен доступ к информации до закрытия формы?Задержка закрытия формы повлияет на работу пользователей приложения (если оно недостаточно быстрое, чтобы они этого не заметили - в каком случае зачем вообще его задерживать?)

Закрытая форма все еще доступна в памятидля вызывающего абонента (если действие закрытия не является caFreeOnClose).Таким образом, вы должны иметь возможность добавлять общедоступные свойства в форму, к которой вы затем можете обращаться в вызывающей стороне.

например,

Type Form2 = Class(TForm)
public
    //Add a public property here
end;

От вызывающей стороны:

if Form2.ShowModal = mrOk then
begin
    InformationIWant = Form2.PublicProperty;
end;
5 голосов
/ 19 октября 2011

Просто сочетание того, что говорят другие.

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

Пример:

Type TFormModal = Class(TForm)
  procedure OnOkClick( Sender : TObject);
  function ValidateInterface : boolean;

public
  procedure SetInterface( input data here);
  procedure GetInterface( output data here);

end;

procedure TFormModal.OnOkClick( Sender : TObject);
begin
  if ValidateInterface 
    then modalResult := mrOk
    else modalResult := mrNone;
end;

из вашей основной формы:

procedure MainForm.OnShowMyModalFormClick( sender : TObject);
var
  myModal : TFormModal;
begin
  ...
  myModal := TFormModal.Create( nil);
  try
    myModal.SetInterface( ...);
    if (myModal.ShowModal = mrOk) then myModal.GetInterface(...);

  finally
    myModal.Free;
  end;
  ...
end;
2 голосов
/ 20 октября 2011

Альтернативой ответу Дэвида является использование событий OnClose или OnCloseQuery. С помощью OnCloseQuery вы можете предотвратить закрытие формы, установив CanClose := false;

2 голосов
/ 19 октября 2011

В дополнение к ответ Джеймса Б. .

Вы должны вызвать Form2.Free, после того, как вы получите нужную информацию.Единица второй формы, что-то вроде:

type
  TForm2 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
    InformationIWant : SomeType;
  end;

var
  Form2: TForm2;

function ReturnValue : SomeType

implementation

function ReturnValue : Sometype;
begin
   try 
     if Form2 = nil then
        Form2 := TForm2.Create(nil);
     Form2.Windowstate := wsNormal;
     Form2.BringToFront;
     SetForegroundWindow(Application.Handle);     
     if Form2.ShowModal then
        Result := InformationIWant
   finally
      FreeAndNil(Form2);
   end;
end;
0 голосов
/ 30 ноября 2018

Допустим, вы хотите сделать больше, чем просто знать, нажал ли пользователь кнопку OK или Отмена в вашем модале с.
Предположим, вам нужно установить некоторые параметры для MainFrom в FromSettings.

  1. Создание и показ мод FormSettings
  2. Когда пользователь нажимает кнопку «ОК» (или «Применить») в FormSettings, чтобы закрыть форму, вы переносите все свои данные из FormSettings в MainForm
  3. Наконец, вызовите FormSettings.Close или лучше FormSettings.Release (не FormSettings.Free), чтобы закрыть форму.

Конечно, MainFrom должен иметь несколько открытых (открытых) полей, в которые вы получаете данные из FormSettings, например:

 FormMain.AlphaBlendValue := FormSettings.spnTransparency;

Подсказка 1:
Вам не нужно переносить данные из FormSettings в MainForm. Если он вам больше подходит, вы также можете сохранить данные в глобальной переменной или записи.

Подсказка 2:
Лично я не использую метод, описанный выше, который предназначен для экономии оперативной памяти при освобождении FormSettings.
Я на самом деле никогда не уничтожаю SettingsForm. Кто-то скажет, что это «ужас», но сегодня компьютеры имеют 4 ГБ или ОЗУ (по крайней мере), а форма с некоторыми элементами управления «израсходует» очень и очень мало этой ОЗУ. Итак, FormSettings в памяти все время. Когда мне нужны некоторые значения, я просто позволяю MainForm читать их из FormSettings.
Опять же ... это определенно рекомендуемый способ сделать это. Это удобный способ :) Вы были предупреждены!

...