8 delphi
我在运行时创建我的表单,如下所示:
AboutForm := TAboutForm.Create(AboutForm);
try
AboutForm.ShowModal;
finally
AboutForm.Free;
end;
Run Code Online (Sandbox Code Playgroud)
但是使用其中任何一个有什么区别:
AboutForm := TAboutForm.Create(Self);
AboutForm := TAboutForm.Create(nil);
AboutForm := TAboutForm.Create(Application);
Run Code Online (Sandbox Code Playgroud)
它们似乎从我能看到的相同但是哪个是正确的,或者它们都是正确的,这通常是最好用的?
感谢您的评论谢谢:)
TForm.Create采用Owneras参数.
在您的第一个示例中,AboutForm是所有者.这显然是一个坏主意,因为它尚未创建.
如果Self是参数,则进行调用的实例是所有者.
何时Application是参数,Application是所有者.
何时nil是参数,AboutForm doen没有所有者.这一切都很好,但在这些情况下,你必须记得自己释放表格.
当您传入所有者时,您实际上不需要明确释放我.当所有者被释放时,所有者将释放它.
这就是你的代码应该是这样的:
AboutForm := TAboutForm.Create(nil);
try
AboutForm.ShowModal;
finally
AboutForm.Free;
end;
Run Code Online (Sandbox Code Playgroud)
当您动态创建表单时,表单就是available表单.你必须传递owner表格.

..所以在你的情况下
AboutForm:= TAboutForm.Create(Self);
AboutForm:= TAboutForm.Create(nil);
AboutForm:= TAboutForm.Create(Application);
是for的所有者AboutForm(你可能已经知道了)
But what is the difference though in using any of these:
这是来自about.com-Form Owner的东西
nil - 指定没有对象拥有该表单 - 因此开发人员(您)负责释放创建的表单(通过在不再需要表单时调用myForm.Free)
Self - 指定调用方法的对象.例如,如果您正在从Button的OnClick处理程序(此按钮放在MainForm上)中创建TMyForm表单的新实例 - self指的是"MainForm".因此,当MainForm被释放时 - 它也将释放"MyForm".
应用程序 - 指定运行应用程序时创建的全局TApplication类型变量."应用程序"封装了您的应用程序,并提供了在程序后台出现的许多功能.
这也是表单所有者
a)Formx.Create(应用程序) - >终止应用程序时将释放表单资源
b)Formx.Create(Self) - >在销毁所有者对象时释放表单资源(如果Self是TComponent的后代)
c)Formx.Create(无) - >您负责释放表格.
这是来自
一个用于用Delphi当窗体自动创建
b对于主窗体来说很方便,它有几个子窗口,当主窗体关闭时需要关闭它们
c对于显示对话窗口很方便
为了解放,您可以ACtion := caFree在表单的附近执行此操作.