【问题标题】:Delphi XE5 Anonymous ShowModal doesn't work as expectedDelphi XE5 Anonymous ShowModal 无法按预期工作
【发布时间】:2014-10-14 03:35:40
【问题描述】:

我是 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..." 消息之后。

我怎么了?

【问题讨论】:

  • android下没有真正的modality,只要在你的匿名proc后面加上after showmodal注释,使用LU RD的释放方法...

标签: android delphi firemonkey delphi-xe5


【解决方案1】:

匿名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 中的文档已更正,Using FireMonkey Modal Dialog Boxes,但此模式可用于所有 Delphi 版本。


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

【讨论】:

  • @whosrdaddy,在匿名方法中直接调用 DisposeOf 是错误的,因为匿名框架依赖于该对象才有效。
  • 啊,是 Modalresult 设置器会给出问题,好的,删除我的 cmets :)
  • 我在匿名方法中移动了ShowMessage('after frm2.ShowModal...'); 行。我得到了预期的结果。谢谢:-)
猜你喜欢
  • 2012-01-03
  • 1970-01-01
  • 2013-12-23
  • 2014-12-09
  • 2016-01-13
  • 2020-09-21
  • 2011-08-17
  • 2012-04-29
  • 2021-08-12
相关资源
最近更新 更多