我在运行时创建我的表单,如下所示:
AboutForm := TAboutForm.Create(AboutForm);
try
AboutForm.ShowModal;
finally
AboutForm.Free;
end;
但是使用其中任何一个有什么区别:
AboutForm := TAboutForm.Create(Self);
AboutForm := TAboutForm.Create(nil);
AboutForm := TAboutForm.Create(Application);
他们似乎从我能看到的东西看起来都是一样的但是正确的,或者它们都是正确的,这通常是最好用的?
感谢您的评论:)
答案 0 :(得分:8)
TForm.Create将Owner
作为参数。
在您的第一个示例中,AboutForm
是所有者。这显然是一个坏主意,因为它尚未创建。
当Self
是参数时,进行调用的实例是所有者
当Application
是参数时,应用程序是所有者
当nil
是参数时,AboutForm不具有所有者。这一切都很好,但在这种情况下你必须记得自己解雇表格。
当你传递给主人时,你实际上并不需要明确地释放我。当所有者被释放后,所有者将释放它。
这就是您的代码的样子:
AboutForm := TAboutForm.Create(nil);
try
AboutForm.ShowModal;
finally
AboutForm.Free;
end;
答案 1 :(得分:5)
当您动态创建表单时,表单为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:
nil - 指定没有对象拥有表单 - 因此开发人员(您)负责释放创建的表单(通过在不再需要表单时调用myForm.Free)
Self - 指定调用方法的对象。例如,如果您正在从Button的OnClick处理程序(此按钮放在MainForm上)中创建TMyForm表单的新实例 - self指的是“MainForm”。因此,当MainForm被释放时 - 它也将释放“MyForm”。
应用程序 - 指定运行应用程序时创建的全局TApplication类型变量。 “应用程序”封装了您的应用程序,并提供了在程序后台发生的许多功能。
这也是Form Owner
a)Formx.Create(应用程序) - >申请被终止时,表格资源将被释放
b)Formx.Create(Self) - >销毁所有者对象时释放表单资源(如果Self是TComponent的后代) c)Formx.Create(nil) - >你有责任解放表格。
这是来自
表单自动处理时,delphi使用a
b 对于包含多个子窗口的主窗体非常方便,这些窗口需要在主窗体关闭时关闭
c 非常便于显示对话框窗口
为了免费,你可以ACtion := caFree
关闭表格。
答案 2 :(得分:2)
第一个
AboutForm := TAboutForm.Create(AboutForm);
告诉TAboutForm,它的所有者是一个对象,之前已经分配给指针“AboutForm”(也可能是NIL - >没有所有者)。
的“所有者”参数
TForm.Create(Owner: TComponent)
告诉表单,谁是它的所有者。如果提供了一些,TComponents会在其所有者处注册。所以,主人和孩子之间有某种沟通方式。
示例:如果所有者被释放,他也可以释放它拥有的组件。
因此,
TAboutForm.Create(Self);
表示“自我”是新TAboutForm的所有者,如果(Self is TComponent)
。
TAboutForm.Create(NIL);
也是一个可以接受的解决方案,但在这里,你必须自己释放组件(除了你在MDI窗口中创建TAboutForm)。