在Delphi中销毁表单的正确方法是什么?

问题描述 投票:1回答:1

我只在自动创建的表单中保留了主表单,其余的都删除了。基本上,我把这些表单用

TMyForm.Create(Self).Show;

但是,当我的作品用这个表单完成后,我怎样才能用最好的方式释放这个表单使用的资源呢?我查了Free,Action.CaFree,Destroy,FreeAndNil函数,但我无法全部掌握。

我在寻找最佳实践。

谢谢。

delphi firemonkey vcl
1个回答
12
投票

这完全取决于表单的使用方式。

模态表单

最简单的情况是当形式是模态的时候。那么你通常会使用下面的成语。

procedure TForm1.btnFrogPropertiesClick(Sender: TObject);
var
  Frm: TFrogPropertiesForm;
begin
  Frm := TFrogPropertiesForm.Create(Self);
  try
    Frm.ShowModal;
  finally
    Frm.Free;
  end;
end;

或者,如果你想做一些特殊的处理,如果用户通过点击关闭对话框的 好的 按钮 取消 按钮)。)

procedure TForm1.btnFrogPropertiesClick(Sender: TObject);
var
  Frm: TFrogPropertiesForm;
begin
  Frm := TFrogPropertiesForm.Create(Self);
  try
    if Frm.ShowModal = mrOk then
      UpdateFrog;
  finally
    Frm.Free;
  end;
end;

注意我用的是 Self 在这两种情况下,我们都是作为所有者。就所有权而言,没有必要这样做,因为很明显,一旦表格关闭,我们就会将其释放。但我经常使用 Self 反正,因为我倾向于使用 Position = poOwnerFormCenter 的对话框。

独立的窗口,当你关闭它们时,它们就会被释放。

另一个特别简单的情况是,当你动态地创建(可能是多个)表单类的实例,并希望在屏幕上以非模式的方式显示它们,直到用户关闭它们,在这种情况下,这些实例被释放。如果是这样,其实很简单。

procedure TForm1.Button1Click(Sender: TObject);
var
  ImageViewer: TImageViewerFrm;
begin
  ImageViewer := TImageViewerFrm.Create(nil);
  ImageViewer.Image := 'flower.jpg';
  ImageViewer.Show;
end;

假设它有一个名为 Image 以图像文件的文件名来显示。

这将在你点击按钮时创建并显示表单。为了确保在你关闭它的时候它被释放,只需在表格中添加一个 OnClose 的处理程序。TImageViewerFrm 并设定 Action 参数为 caFree:

procedure TImageViewerFrm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

使用这种方法,你可以用不同的图像创建任意数量的图像查看器窗体,它们都会一直存在,直到用户关闭它们,或者直到应用程序被终止。

其他方法

当然,还有更多可能的情况,因此,也有更多可能的解决方案。在某些情况下,您可能希望完全控制某个特定类型的表单,因此您将它们存储在一个数组中。这时可以使用 MyForm.FreeFreeAndNil(ImageForms[4]).

FreeAndNil(X) 切实做到 X.Free; X := nil (但更安全的方式),也就是说,它将变量设置为 nil 后,释放它曾经指向的对象。这样就可以避免指针悬空。在某些情况下,你必须这样做。(但现在我离题了。这一般适用于 Delphi 对象,而与窗体无关。)

但是在 Delphi 中,您永远不会通过写下 X.Destroy. 你使用 X.Free 这实际上 if X <> nil then X.Destroy.

如果你想了解更多这方面的知识,我强烈建议你买一本关于Delphi编程的好教材。没有比这更有效的方法了 真的 学习它。


0
投票

如果你正在创建一个表单,并且你希望它在关闭后释放自己,那么在ONCLOSE事件中写上 action := cafree;

这样一来,你就不用用TRY... ... 最后挡住它来释放。

© www.soinside.com 2019 - 2024. All rights reserved.