首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi-XE5 Android开发。自由非模态形式的最佳方式是什么?

Delphi-XE5 Android开发。自由非模态形式的最佳方式是什么?
EN

Stack Overflow用户
提问于 2013-11-16 06:29:50
回答 2查看 2.4K关注 0票数 2

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-16 13:57:43

更新

见下文的重要说明。

在XE5 for Android中,可以使用匿名方法显示带有模态结果的表单,这是一个重载的ShowModal过程:

程序ShowModal(const ResultProc: TProc);过载;

您可以在本文中找到由Marco坎图,Delphi XE5 Anonymous ShowModal and Android所描述的内容。

下面是如何使用此过程的示例:

代码语言:javascript
复制
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。使用此模式来释放模态对话框,释放您的模式对话框

代码语言:javascript
复制
procedure TModalForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := TCloseAction.caFree;
end;
票数 3
EN

Stack Overflow用户

发布于 2013-12-10 05:33:24

不要忘记在ObjectInspector中设置

代码语言:javascript
复制
ModalResult = mrOK

或者在你的

代码语言:javascript
复制
procedure TForm1.ExitButtonClick(Sender: TObject);
begin
   ModalResult := mrOK;
end;

例如,上面的dlg.ShowModal!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20015519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档