在Modal表单关闭之前获取数据

时间:2011-10-19 12:15:42

标签: delphi modal-dialog

我有一个Modal表单,在Ok按钮中它处理一些信息,我需要在调用模态表单的表单中。

如何在关闭之前将其取出?

或延迟收盘直到我说它可以关闭。

6 个答案:

答案 0 :(得分:11)

我希望您的确定按钮的ModalResult设置为mrOK。如果要将错误检查添加到“确定”按钮,请将其更改为mrNone。向按钮添加OnClick处理程序,该按钮执行您需要的任何检查或处理。如果确定表单可以关闭,请在Self.ModalResult := mrOK处理程序中设置OnClick

答案 1 :(得分:7)

在表单关闭之前,您真的需要访问这些信息吗?延迟关闭表单会影响应用程序的用户体验(除非它足够快,以至于他们没有注意到 - 在这种情况下为什么要延迟它?)

关闭表单在内存中仍然可用于调用者(除非关闭操作是caFreeOnClose)。因此,您应该能够将公共属性添加到表单中,然后您可以在调用者中访问该表单。

e.g

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

来自来电者:

if Form2.ShowModal = mrOk then
begin
    InformationIWant = Form2.PublicProperty;
end;

答案 2 :(得分:5)

只是其他人所说的内容的组合。

最好形式化如何从模态对话框中验证和获取数据。 一遍又一遍地使用相同的技术使一切都更容易维护和阅读。

一个例子:

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;

答案 3 :(得分:2)

作为JamesB's answer的补充。

您必须致电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;

答案 4 :(得分:2)

David的答案替代方法是使用OnCloseOnCloseQuery个事件。使用OnCloseQuery,您可以通过设置CanClose := false;

来阻止表单关闭

答案 5 :(得分:0)

比方说,您要做的不只是简单地知道用户是否按了模态来源中的“确定”或“取消”按钮。
假设您需要在FromSettings中为MainFrom设置一些参数。

  1. 创建并显示FormSettings模式
  2. 当用户按下FormSettings中的“确定”(或“应用”)按钮以关闭表单时,您会将所有数据从FormSettings传输到MainForm
  3. 最后调用FormSettings.Close或更好的FormSettings.Release(不是FormSettings.Free)来关闭表单。

当然,MainFrom必须具有一些公开的(公共)字段,您可以在其中从FormSettings接收数据,例如:

 FormMain.AlphaBlendValue := FormSettings.spnTransparency;

提示1:
您不必将数据从FormSettings传输到MainForm。如果更适合您,您还可以将数据保存在全局变量中或进行记录。

提示2:
我个人不使用上述方法,该方法旨在在释放FormSettings时节省RAM。
实际上,我从未破坏过SettingsForm。有人会说这是“恐怖”的事情,但是今天的计算机至少有4GB或RAM,并且带有某些控件的表单将“浪费”非常少的RAM。因此,FormSettings一直是内存。当我需要一些值时,只需让MainForm从FormSettings中读取它们即可。
同样,这绝对是推荐的方法。这是方便的方法:)您已经被警告!