我使用的是Delphi 7(我知道它的古董),并且我对某个表格感到有点困惑,我会根据需要进行创建并在完成后进行销毁。
从我的主表单中,我创建了另一个请求用户名和密码的表单。新创建的表单属性等包含在另一个单元中,并包含在Uses子句中。
我以前的主要形式"有"以下代码;
var
MyOtherForm: TMyotherform;
Begin
MyOtherForm := TMyotherform.create(Nil);
{ Then I do stuff - blah blah }
MyOtherForm.free;
End;
我的问题是,当我在主单元中删除MyOtherForm的声明时,它仍可正常工作。例如;
{ var // removed
MyOtherForm: TMyotherform; // removed }
Begin
MyOtherForm := TMyotherform.create(Nil);
{ Then I do stuff }
MyOtherForm.free;
End;
同样的结果,表格照常创建并销毁。我无法理解的是为什么。过去我在主单元中声明我的表单,或者在一个单独的单元中声明它是否足够,我做错了吗?
答案 0 :(得分:7)
默认情况下,Delphi为表单创建一个全局变量。它被添加到表单的类声明之下。
该变量的名称是班级名称减去' T',因此它与您用于本地变量的名称相同,这就是代码仍然有效的原因:您刚存储该全局变量中的新引用。
如果您有自动创建表单,Delphi将在启动应用程序时创建表单实例,并将引用存储在该全局中。您可以在项目选项中管理自动创建的表单和数据模块,或者您只需编辑dpr文件,您将在其中找到如下行:
Application.CreateForm(TMyotherform, Myotherform);
但即使您的表单未自动创建,Delphi 仍然添加该全局变量。
就个人而言,我根本不喜欢这些全局变量,而且在创建表单或数据模块时,我总是手动删除它们。不幸的是,似乎没有可能配置它。
所以:删除全局并声明局部变量,就像在原始代码中一样。这是正确的方法。全球化是为了让初学者更容易,但它无助于您的应用程序的可维护性。