我是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 ...之后”消息。
我怎么了?
答案 0 :(得分:3)
对匿名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版本。
结论:如果要在关闭模式对话框后执行代码,请将该代码放在匿名方法中。