【问题标题】:Creating a form that has not been declared works - I don't know why创建一个尚未声明的表单有效 - 我不知道为什么
【发布时间】:2016-09-13 16:45:25
【问题描述】:

我正在使用 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;

同样的结果,表单像往常一样被创建并被销毁。我无法理解的是为什么。过去我在主单元中声明我的表单是否做错了,还是在单独的单元中声明就足够了?

【问题讨论】:

  • 很可能MyOtherForm 被声明为包含TMyotherform 的单元中的全局变量。当您向项目添加新表单时,默认情况下会发生这种情况。
  • 你在其他地方声明了这个变量。 Search 为它。
  • 你在范围内的某个地方(我们不能告诉你确切的位置)。使用“查找声明”功能。
  • 它仅在其他单元中声明,在项目内的任何其他文件中均未提及。我想说塞巴斯蒂安也是正确的,它在包含它的单元中是全局的。我不知道这是否足够,认为它必须在调用单元中声明。
  • 回复:做错了 - 可能是的。如果您在提供的代码之外的其他地方使用此变量,那么您可能会覆盖一些有意义的数据。如果不是 - 删除外部声明,使用尽可能窄的范围 - 本地的。

标签: delphi delphi-7


【解决方案1】:

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

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

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

Application.CreateForm(TMyotherform, Myotherform);

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

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

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

【讨论】:

  • 最好不要编辑 dpr 文件。 Delphi 有一个习惯是撤销你对这个文件所做的更改。
  • @GolezTrol,它不是自动创建的,根本不在项目源中。你自己和塞巴斯蒂安大多是对的,它在另一个单元中被声明并且看起来足够了。我学到了一些东西......我不必在调用单元中重新声明。编辑:我还从项目源中删除了自动创建的表单,并在以后根据需要创建表单。
  • 没有。请在另一个单元中重新声明它。删除全局变量。这只是为了在 20 世纪吸引 VB 程序员使用 Delphi,而不再相关。
  • 反过来做。去掉全局声明,在调用单元中声明局部变量。这样,当您想要创建表单的多个实例时就不会遇到麻烦,并且如果它仍然包含一个实例,您不必签入某个全局变量。您的原始代码很好。应该删除全局。我已经改写了我的最后一段以使其更清楚。 -edit- 大卫也这么说,所以它一定是对的。 ;o)
  • unit 变量(在 Delphi 中没有全局变量)只是适合初学者。如果您选择自动创建表单,这也很重要,因为这会在 DPR 中生成依赖于该单元变量存在的代码。您可能也认为自动创建的表单是“初学者”功能,但不一定如此,尤其是在可以说是 productivity 功能的更简单的应用程序中。您不能删除 all 此类单元变量,从不自动创建表单并且从不编辑 DPR。前者强迫你采用后者。
猜你喜欢
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 2015-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多