TMyForm.Create(Self).Show;
但是当我的工作使用这个表单完成后,我应该用最好的方式释放这个表单所使用的资源?我查阅了Free,Action.CaFree,Destroy,FreeAndNil函数,但我无法理解它们。
我正在寻找最佳实践。
谢谢。
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;
或者,如果您希望在用户通过点击 OK 按钮(而不是取消按钮)关闭对话框时执行某些特殊处理:
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
的公共属性,该属性接受要显示的图像文件的文件名。TImageViewerFrm
添加一个OnClose
处理程序,并将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编程的好书。这是真正学习它的最有效方法。
nil
,窗口将保持打开直到用户关闭它。如果传入Self
,窗口将保持打开直到用户关闭它或者Self
被销毁。这可能是需要的,也可能不是。 - undefined如果你正在创建一个表单,希望在关闭后自动释放它,则可以在 ONCLOSE 事件中写入 action := cafree;
。
这样就不必再使用 TRY...FINALLY 块来释放它。