我正在尝试在主窗体启动时加载窗体。我使用 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/