在Delphi for windows中,Free(Form.free)关闭的辅助动态创建表单没有问题,因为“ShowModal”方法在哪里。但是Delphi for Android不支持Form.ShowModal,我们必须使用Show方法。但我弄清楚当我关闭(Form.close)二级形式时它仍在内存中,甚至运行代码Onresize事件(???)。在非模态调用中释放表单的最佳方法是什么?
换句话说:如何从该窗体上的OnClick事件处理程序关闭窗体,并确保窗体的析构函数运行?
答案 0 :(得分:3)
<强>更新强>
请参阅下面的重要提示。
在XE5 for Android中,有可能使用匿名方法显示带有模态结果的表单,一个重载的ShowModal
过程:
procedure ShowModal(const ResultProc:TProc);过载;
你可以在Marco Cantu撰写的文章中找到它,Delphi XE5 Anonymous ShowModal and Android
。
以下是如何使用此过程的示例:
var
dlg: TForm1;
begin
dlg := TForm1.Create(nil);
// select current value, if avaialble in the list
dlg.ListBox1.ItemIndex := dlg.ListBox1.Items.IndexOf(Edit1.Text);
dlg.ShowModal(
procedure(ModalResult: TModalResult)
begin
if ModalResult = mrOK then
// if OK was pressed and an item is selected, pick it
if dlg.ListBox1.ItemIndex >= 0 then
edit1.Text := dlg.ListBox1.Items [dlg.ListBox1.ItemIndex];
dlg.DisposeOf; // Wrong !!!, see note below
end);
请注意, dlg.DisposeOf;
会强制销毁表单,从而覆盖ARC自动处理。
您还可以在文档Using Modal Dialog Boxes in Mobile Apps
和此处ShowModal Dialogs in FireMonkey Mobile Apps
中找到说明。
正如其他人http://www.malcolmgroves.com/blog/?p=1585所发现的那样,在匿名方法中调用DisposeOf
是错误的,因为匿名框架必须能够处理来自有效对象的ModalResult。请使用此模式来释放模态对话框Freeing Your Modal Dialog Box。
procedure TModalForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := TCloseAction.caFree;
end;
答案 1 :(得分:0)
不要忘记在ObjectInspector中设置
ModalResult = mrOK
或在您的
中procedure TForm1.ExitButtonClick(Sender: TObject);
begin
ModalResult := mrOK;
end;
上面的示例dlg.ShowModal!