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

Adm*_*tom 3 delphi delphi-7

我正在使用Delphi 7(我知道它是古董)并且我对我正在创建的表单有点困惑,并在完成它时进行破坏.

从我的主表单中,我创建了另一个请求用户名和密码的表单.新创建的表单属性等包含在另一个单元中,并包含在Uses子句中.

在我的主要形式,我以前"有"以下代码;

var
  MyOtherForm: TMyotherform;
Begin
  MyOtherForm := TMyotherform.create(Nil);

    { Then I do stuff - blah blah }

  MyOtherForm.free;
End;
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我在我的主单元中删除MyOtherForm的声明时,它仍然可以正常工作.例如;

{ var // removed
   MyOtherForm: TMyotherform; // removed }

Begin
  MyOtherForm := TMyotherform.create(Nil);

    { Then I do stuff }

  MyOtherForm.free;
End;
Run Code Online (Sandbox Code Playgroud)

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

Gol*_*rol 7

默认情况下,Delphi为表单创建一个全局变量.它添加在表单的类声明下面.

该变量的名称是类名减去'T',因此它与您的局部变量使用的名称相同,这就是代码仍然有效的原因:您只是在该全局变量中存储了一个新引用.

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

Application.CreateForm(TMyotherform, Myotherform);
Run Code Online (Sandbox Code Playgroud)

但即使您的表单不是自动创建的,Delphi 仍会添加该全局变量.

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

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

  • 不可以.在其他单位重新安装.删除全局变量.这只是为了让VB程序员在20世纪引诱Delphi不再具有相关性. (3认同)
  • 反过来做.删除全局声明并在调用单元中声明局部变量.这样,当您想要创建表单的多个实例时,您将不会遇到麻烦,并且如果它仍包含实例,则不必签入某个全局变量.你的原始代码很好.应删除全局.我已经改写了我的最后一段,以便更清楚.-edit-大卫也这么说,所以一定是对的.; O) (2认同)