Tak*_*vac 3 delphi vcl firemonkey
我只在自动创建表单中保留主表单并删除其余表单。基本上我把这些表格称为
TMyForm.Create(Self).Show;
Run Code Online (Sandbox Code Playgroud)
但是当我用这个表格完成工作时,我如何最好地释放这个表格使用的资源?我查找了 Free、Action.CaFree、Destroy、FreeAndNil 函数,但我无法全部获取。
我正在寻找最佳实践。
谢谢。
And*_*and 12
这完全取决于表单的使用方式。
最简单的情况是表单是模态的。然后你通常使用以下习语:
procedure TForm1.btnFrogPropertiesClick(Sender: TObject);
var
Frm: TFrogPropertiesForm;
begin
Frm := TFrogPropertiesForm.Create(Self);
try
Frm.ShowModal;
finally
Frm.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
或者,如果您想在用户通过单击“确定”按钮(而不是“取消”按钮)关闭对话框时进行一些特殊处理:
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;
Run Code Online (Sandbox Code Playgroud)
请注意,我Self在这两种情况下都使用as owner。出于所有权的考虑,这不是必需的,因为——很明显——我们在表单关闭后立即释放它们。但Self无论如何我经常使用,因为我倾向于使用Position = poOwnerFormCenter我的对话框。
另一个特别简单的情况是,当您动态创建(可能是多个)表单类的实例并希望以非模态方式将它们显示在屏幕上时,直到用户关闭它们,在这种情况下,实例将被释放。如果是这样,那真的很简单:
procedure TForm1.Button1Click(Sender: TObject);
var
ImageViewer: TImageViewerFrm;
begin
ImageViewer := TImageViewerFrm.Create(nil);
ImageViewer.Image := 'flower.jpg';
ImageViewer.Show;
end;
Run Code Online (Sandbox Code Playgroud)
假设它有一个名为的公共属性Image,该属性采用要显示的图像文件的文件名。
当您单击按钮时,这将创建并显示表单。为了确保在关闭它时它被释放,只需向 中添加一个OnClose处理程序TImageViewerFrm并将Action参数设置为caFree:
procedure TImageViewerFrm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
Run Code Online (Sandbox Code Playgroud)
使用这种方法,您可以使用不同的图像创建任意数量的图像查看器表单,并且它们都将一直存在,直到用户关闭它们,或者直到应用程序终止。
当然,还有更多可能的场景,因此也有更多可能的解决方案。在某些情况下,您可能希望完全控制特定类型的表单,因此将它们存储在数组中。可以使用MyForm.Free或释放它们FreeAndNil(ImageForms[4])。
FreeAndNil(X)有效地X.Free; X := nil(但以更安全的方式),也就是说,它nil在释放了它曾经指向的对象后将变量设置为。这样你就可以避免悬空指针。在某些情况下,您必须这样做。(但现在我离题了。这适用于一般的 Delphi 对象,与特定的形式无关。)
但是在 Delphi 中,您永远不会通过编写X.Destroy. 您X.Free可以有效地使用which if X <> nil then X.Destroy。
如果您想了解更多关于这方面的知识,我强烈建议您购买一本关于 Delphi 编程的好教科书。没有比真正学习它更有效的方法了。