在中,自由(Form.free)封闭的二级动态创建表单没有问题,因为"ShowModal“方法在哪里。但是Delphi不支持Form.ShowModal,我们必须使用Show。但是我发现当我关闭(Form.close)辅助形式时,它仍然在内存中,甚至运行代码Onresize事件(?)。非模态调用中释放表单的最佳方式是什么?
换句话说:如何从表单上的OnClick事件处理程序关闭表单,并确保窗体的析构函数运行?
发布于 2013-11-16 13:57:43
更新
见下文的重要说明。
在XE5 for Android中,可以使用匿名方法显示带有模态结果的表单,这是一个重载的ShowModal过程:
程序ShowModal(const ResultProc: TProc);过载;
您可以在本文中找到由Marco坎图,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。使用此模式来释放模态对话框,释放您的模式对话框。
procedure TModalForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := TCloseAction.caFree;
end;发布于 2013-12-10 05:33:24
不要忘记在ObjectInspector中设置
ModalResult = mrOK或者在你的
procedure TForm1.ExitButtonClick(Sender: TObject);
begin
ModalResult := mrOK;
end;例如,上面的dlg.ShowModal!
https://stackoverflow.com/questions/20015519
复制相似问题