delphi - 在应用程序上创建两次的表单 Form Create 事件

标签 delphi

我正在尝试在主窗体启动时加载窗体。我使用 ShowModal 来做到这一点。此外,该表单不是自动创建表单,因此我必须先使用 application.CreateForm 创建它。

我的问题是,当我尝试在 FormCreate 事件中加载表单时,它加载了两次表单,当我关闭表单时,我的整个应用程序都关闭了。

这是我的代码:

procedure Tfrm_main.FormCreate(Sender: TObject);
var
  username, password : string;
begin
  username := ini.ReadString('user','username','');
  if username = '' then
  begin
    application.CreateForm(Tfrm_user,frm_user);
    frm_user.ShowModal;
  end;
end;

我该如何解决这个问题?谢谢。

最佳答案

您问题中的代码是从调用创建主窗体的 Application.CreateForm 调用的。然后您再次递归调用 Application.CreateForm,这导致 Tfrm_user 实例成为主窗体。

众所周知,Application.CreateForm 创建的第一个窗体成为主窗体。在这里,您调用 Application.CreateForm 来创建主窗体。但是在 Application.CreateForm 的代码确定 VCL 认为什么是主窗体之前,会执行对 Application.CreateForm 的递归调用。一直到最后,并在这样做时确定主要形式是递归调用的次要形式。

然后您将以模态方式显示次级窗体。稍后调用 Application.Run,它显示 VCL 主窗体,即您的辅助窗体。再次。然后你关闭它。这将关闭程序,因为这就是您关闭 VCL 主窗体时发生的情况。

我的建议是在程序的生命周期内只调用一次 Application.CreateForm。因此,在 OnCreate 处理程序中创建另一个表单,如下所示:

frm_user := Tfrm_user.Create(Application);

或者让主窗体成为所有者。并且当然考虑不使用全局变量 frm_user。我会删除它。

或者另一种选择是在调用 Application.CreateForm 之前模态显示辅助表单。

关于delphi - 在应用程序上创建两次的表单 Form Create 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25632482/

相关文章:

delphi - 带有 UseExplorerThemes 的 VirtualTreeView

delphi - 从delphi 7迁移到delphi XE4时出现TSQLDataset错误

Delphi BPL 搜索路径

delphi - Delphi 有缓存框架吗?

delphi - 传递序数参数

delphi - 创建和/或写入文件

delphi - 从 Delphi 应用程序识别 Interbase 表中已更改的行

C# 和 Delphi 集成

delphi - 从 Delphi 应用程序将文本样式写入 DXF

arrays - Delphi将动态记录数组传递给函数