Delphi XE5 Anonymous ShowModal无法按预期工作

我是Delphi XE5的新手,目前正在使用Delphi XE5在我的Windows桌面上开发Android平台应用程序。 我有两种形式(Form1和Form2),并试图按照Marco的RAD博客(http://blog.marcocantu.com/blog/xe5_anonymous_showmodal_android.html)中显示的方式在Form1上以模态方式显示Form2。

但结果并不如预期。

procedure TForm1.Button1Click(Sender: TObject);
var
  frm2: TForm2;
begin
  frm2 := TForm2.Create(nil);

  ShowMessage('before frm2.ShowModal...');
  frm2.ShowModal (
    procedure(ModalResult: TModalResult)
    begin
      if ModalResult = mrOK then
        if frm2.ListBox1.ItemIndex >= 0 then
          edit1.Text := frm2.ListBox1.Items [frm2.ListBox1.ItemIndex];
      frm2.DisposeOf;
    end
  );
  ShowMessage('after frm2.ShowModal...');
end;

我写了上面的代码并在Android设备上运行应用程序。 我点击了Button1,然后我得到了“frm2.ShowModal ...”之前的消息框,然后是“frm2.ShowModal ...”之后的消息框,然后显示了Form2。

我期望的顺序应该是1)“frm2.ShowModal ...”之前的消息,2)正在显示的Form2,以及3)“之后的frm2.ShowModal ...”消息。

我怎么了?


对匿名ShowModal的调用不会被阻塞,这意味着ShowModal之后的任何代码都将首先执行。

一个说明在这里。 调用frm2.DisposeOf是错误的。 你必须使用这种模式:

宣布

procedure TFrm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := TCloseAction.caFree;
end;

请参阅http://www.malcolmgroves.com/blog/?p=1585。 该文档已在XE7中使用FireMonkey模式对话框进行了更正,但此模式可用于所有Delphi版本。


结论 :如果要在模式对话框关闭后执行代码,请将该代码放入匿名方法中。

链接地址: http://www.djcxy.com/p/50635.html

上一篇: Delphi XE5 Anonymous ShowModal doesn't work as expected

下一篇: Delphi XE5 FireMonkey TstringGrid cells don't accept keyboard input