Delphi-XE5 Android开发。免费非模态表格的最佳方法是什么?

时间:2013-11-16 06:29:51

标签: android delphi memory-leaks delphi-xe5

在Delphi for windows中,Free(Form.free)关闭的辅助动态创建表单没有问题,因为“ShowModal”方法在哪里。但是Delphi for Android不支持Form.ShowModal,我们必须使用Show方法。但我弄清楚当我关闭(Form.close)二级形式时它仍在内存中,甚至运行代码Onresize事件(???)。在非模态调用中释放表单的最佳方法是什么?

换句话说:如何从该窗体上的OnClick事件处理程序关闭窗体,并确保窗体的析构函数运行?

2 个答案:

答案 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!

相关问题