gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:05:47 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com