我只在自动创建的表单中保留了主表单,其余的都删除了。基本上,我把这些表单用
TMyForm.Create(Self).Show;
但是,当我的作品用这个表单完成后,我怎样才能用最好的方式释放这个表单使用的资源呢?我查了Free,Action.CaFree,Destroy,FreeAndNil函数,但我无法全部掌握。
我在寻找最佳实践。
谢谢。
这完全取决于表单的使用方式。
最简单的情况是当形式是模态的时候。那么你通常会使用下面的成语。
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.Free
或 FreeAndNil(ImageForms[4])
.
FreeAndNil(X)
切实做到 X.Free; X := nil
(但更安全的方式),也就是说,它将变量设置为 nil
后,释放它曾经指向的对象。这样就可以避免指针悬空。在某些情况下,你必须这样做。(但现在我离题了。这一般适用于 Delphi 对象,而与窗体无关。)
但是在 Delphi 中,您永远不会通过写下 X.Destroy
. 你使用 X.Free
这实际上 if X <> nil then X.Destroy
.
如果你想了解更多这方面的知识,我强烈建议你买一本关于Delphi编程的好教材。没有比这更有效的方法了 真的 学习它。
如果你正在创建一个表单,并且你希望它在关闭后释放自己,那么在ONCLOSE事件中写上 action := cafree;
这样一来,你就不用用TRY... ... 最后挡住它来释放。