Delphi 在模式窗体关闭之前从其获取数据

Delphi 在模式窗体关闭之前从其获取数据,delphi,modal-dialog,Delphi,Modal Dialog,我有一个模态表单,在Ok按钮中,它处理一些信息,这些信息是我在称为模态表单的表单中需要的 我怎样才能在关门前把它弄出来 或者延迟关闭,直到我说它可以关闭。我希望您的“确定”按钮将ModalResult设置为mrOK。如果要将错误检查添加到“确定”按钮,请将其更改为mrNone。在按钮上添加一个OnClick处理程序,该处理程序执行您需要的任何检查或处理。如果确定表单可以关闭,请在OnClick处理程序中设置Self.ModalResult:=mrOK。关闭表单之前,您真的需要访问信息吗?延迟关闭

我有一个模态表单,在Ok按钮中,它处理一些信息,这些信息是我在称为模态表单的表单中需要的

我怎样才能在关门前把它弄出来


或者延迟关闭,直到我说它可以关闭。

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

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


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

e、 g

从调用方:

if Form2.ShowModal = mrOk then
begin
    InformationIWant = Form2.PublicProperty;
end;
作为补充

在你获取你想要的信息后,你必须给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;

只是其他人所说的话的组合

将如何验证和从模式对话框中获取数据形式化是一个好主意。 反复使用相同的技术可以使所有内容更易于维护和阅读

例如:

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;

David回答的另一种方法是使用
OnClose
OnCloseQuery
事件。使用
OnCloseQuery
可以通过设置
CanClose:=false来防止表单关闭

假设您想要做的不仅仅是简单地知道用户是否在您的模式中按下了“确定”或“取消”按钮。
假设您需要在FromSettings中为Main设置一些参数

  • 创建并显示FormSettings模式
  • 当用户按下FormSettings中的“OK”(或“Apply”)按钮关闭表单时,您将所有数据从FormSettings传输到MainForm
  • 最后调用FormSettings.Close或更好的FormSettings.Release(非FormSettings.Free)关闭表单
  • 当然,MainFrom必须有一些公开(公共)字段,在这些字段中您可以从FormSettings接收数据,例如:

     FormMain.AlphaBlendValue := FormSettings.spnTransparency;
    

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

    提示2:
    我个人不使用上述方法,该方法旨在释放FormSettings时保存RAM。
    实际上我从来没有破坏过设置窗体。有些人会说这是“恐怖”的,但今天的计算机有4GB或RAM(至少),并且一个带有一些控件的表单将“浪费”很少的RAM。因此,FormSettings始终在内存中。当我需要一些值时,我只让主窗体从FormSettings读取它们。

    再一次。。。这绝对是推荐的方法。这是最方便的方式:)你已经被警告了

    祝贺你登上了榜首。有人知道为什么这个答案有两张反对票吗?这似乎是解决问题中“延迟关闭直到我说它可以关闭”部分的唯一答案。在关闭表单之前,我需要做一些事情,这解决了我的问题!这里有几个问题:1<代码>显示
    不是一项功能。你大概是指
    ShowModal
    。2.你没有提到问题中关于“延迟关闭直到我说它可以关闭”的部分。@DavidHeffernan:谢谢大卫,我目前没有访问德尔福的权限,所以无法检查。我已经更新了答案。我已尝试解决您的第二个问题,通常需要验证数据并阻止表单关闭。这必须发生在表单内部,而不是在
    showmodel
    返回之后。@DavidHeffernan:我认为这个问题不是关于验证数据,而是关于访问调用代码中对话框的数据。JamesB在回答中提到了这一点。“除非关闭操作是caFreeOnClose”-不幸的是,在许多(大多数?)情况下都会发生这种情况。FreeAndNil(Form2)清楚地表明,Form2可以是
    ReturnValue
    中的局部变量,而不是全局变量。重要信息:最好在表单上调用.Release,而不是.Free。释放将使表单有机会处理队列中所有剩余的消息。见:
     FormMain.AlphaBlendValue := FormSettings.spnTransparency;