创建一个尚未声明的表单 - 我不知道为什么

时间:2016-05-17 14:10:28

标签: delphi delphi-7

我使用的是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;

同样的结果,表格照常创建并销毁。我无法理解的是为什么。过去我在主单元中声明我的表单,或者在一个单独的单元中声明它是否足够,我做错了吗?

1 个答案:

答案 0 :(得分:7)

默认情况下,Delphi为表单创建一个全局变量。它被添加到表单的类声明之下。

该变量的名称是班级名称减去' T',因此它与您用于本地变量的名称相同,这就是代码仍然有效的原因:您刚存储该全局变量中的新引用。

如果您有自动创建表单,Delphi将在启动应用程序时创建表单实例,并将引用存储在该全局中。您可以在项目选项中管理自动创建的表单和数据模块,或者您只需编辑dpr文件,您将在其中找到如下行:

Application.CreateForm(TMyotherform, Myotherform);

但即使您的表单未自动创建,Delphi 仍然添加该全局变量。

就个人而言,我根本不喜欢这些全局变量,而且在创建表单或数据模块时,我总是手动删除它们。不幸的是,似乎没有可能配置它。

所以:删除全局并声明局部变量,就像在原始代码中一样。这是正确的方法。全球化是为了让初学者更容易,但它无助于您的应用程序的可维护性。