Delphi中“主窗体”名称存储在哪里?

3
哪个物理文件存储了Delphi应用程序的主窗体名称?
例如,MyApplication有一个名为MyForm的窗体,通过项目选项设置为“主窗体”。信息“主窗体= MyForm”实际上存储在哪里?
在Delphi IDE中,应用程序的“主窗体”是通过菜单指定的:Project | Options | Forms
显然的文件应该是.bdsproj或.dpr文件,但是这两个文件中似乎都没有任何指示哪个窗体是“主要”的。
2个回答

17

它在项目(.DPR)文件中。第一个使用窗体作为参数调用Application.CreateForm()的方法标识应用程序的主窗体。

请注意,TDataModule不满足上述要求;这实际上很有用,因为你可以在主窗体之前自动创建一个数据模块,然后在主窗体的构造函数中访问该数据模块。


是的,数据模块不符合成为主窗体的条件(显然),并且它们被排除在我提到的“首次调用”规则之外。我会编辑我的帖子以反映这个更正。 - Ken White
@Ken:自动创建数据模块以在主窗体的构造函数中访问它们,为什么比在那里创建它们更好? - mghie
可能是因为在主窗体中创建数据模块会在数据模块和主窗体之间产生不必要的绑定。这会使得主窗体拥有数据模块的所有权。 - Vegar
@Vegar:无论是应用程序还是主窗体拥有数据模块都没有关系。而且绑定已经存在,因为应用程序对象和主窗体在项目中都是最高级别的。这并不能完全说服我。【续】 - mghie
@mghie:关于全局变量。在我的Delphi应用程序中,我最多只有两个全局变量。一个是主窗体的变量,TApplication需要它;另一个是数据模块(如果有)声明的变量。其他所有变量都会根据需要在本地创建,并分配给本地变量(或者根本不分配)。 - Ken White
显示剩余8条评论

1

仅补充Ken White的答案。

如果您查看CreateForm的源代码:

procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
var
  Instance: TComponent;
begin
  Instance := TComponent(InstanceClass.NewInstance);
  TComponent(Reference) := Instance;
  try
    Instance.Create(Self);
  except
    TComponent(Reference) := nil;
    raise;
  end;
  if (FMainForm = nil) and (Instance is TForm) then
  begin
    TForm(Instance).HandleNeeded;
    FMainForm := TForm(Instance);
  end;
end;

你可以看到这个函数(尽管它的名字)可以用来创建其他组件。但是只有第一个成功创建的TForm组件才能成为主窗体。

然后是对全局变量的抱怨。

是的,全局变量通常是不好的,但是对于应用程序对象和主窗体对象,你可以做出例外。虽然你可以省略主窗体的全局变量,但你需要自己编辑dpr文件:

改为:

begin
  Application.Initialize;
  Application.CreateForm(TMyMainForm, MyMainFormGlobal);
  Application.Run
end.

至:

procedure CreateMain;
var
  mainform : TMyMainForm;
begin
  Application.CreateForm(TMyMainForm, mainform);
end;

begin
  Application.Initialize;
  CreateMain;
  Application.Run
end.

而且你失去了所有的全局表单。


@Gamecat:你最后一块代码有打字错误。你声明了“mainform”,但是在CreateForm()调用中使用了旧的“MyMainFormGlobal”。你可能想要修复它。 <g> - Ken White
你确定最后一段代码能够正常工作吗?IDE 不允许看起来应该在主 begin-end 块中的代码出现在 DPR 文件的其他位置。如果进行错误更改,则 IDE 允许编译项目是随机的。 - Rob Kennedy
是的,它有效。 (我使用2006年尝试过)。我知道IDE不喜欢它,但它也不喜欢其他合法结构。只要它能编译和运行,对我来说就没有问题。 - Toon Krijthe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接