一些数据库应用程序开发人员更喜欢在主表单之前通过编辑项目源文件来创建数据模块
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TDM, DM);
Application.CreateForm(TMainForm, MainForm);
{...}
Application.Run;
end.
Run Code Online (Sandbox Code Playgroud)
问题是 - 为什么?什么是利弊?
有没有办法从窗体的OnCreate事件处理程序或C++ Builder构造函数中取消或中止表单创建?
基本上,我希望能够从OnCreate或构造函数中调用Close()并让它完全跳过显示表单.我有几种形式,作为初始化的一部分可能会确定它们根本不应该显示.(我意识到我可以拆分初始化的这一部分或者从调用表单或类似的内容中添加额外的检查,但是如果有办法从OnCreate或构造函数中干净地完成所有这些操作,那么这似乎是最简单的.)
编辑: 回应一些评论,一些不显示的逻辑是UI逻辑而不是业务逻辑; 表单可能会在显示之前显示确认,或者它可能使用公共对话框来获取表单的输入,然后在用户取消该对话框时中止.(其中一些是业务逻辑,需要重构,但通常很难找到时间来重构所有需要它的东西.)
我认为这必须是常见问题解答,但谷歌搜索并没有真正帮助.
我该怎么办 - 可能不会 - 在FormCreate()?
我想知道所有表单的子控件是否已完全创建并可用于访问等.
我问的原因是我偶然发现了一个我FormCreate()简单组成的 旧项目
Sleep(1000);
PostMessage(Handle, UM_PROGRAM_START, 0, 0);
Run Code Online (Sandbox Code Playgroud)
似乎我想"稍微等一下"然后做一些初始化"当事情已经稳定下来"......
当然我当时有理由(?),但是,在没有启发性评论的情况下,我无法回想起为什么我认为这是必要的.
任何人都可以陈述或引用一个链接,说明对其可能做的任何限制FormCreate()吗?
[更新]我认为DavidHefferman在撰写"应用程序开始提取消息时找到了解决方案.当您在.dpr文件中调用Application.Run时会发生这种情况".
我想我并不关心单一形式.例如,我的主要表单想要在启动时使用我的配置/选项表单做一些事情,所以显然必须等到它被创建.
这是我的一个项目的典型.DPR ......
Application.Initialize;
Application.CreateForm(TGlobal, Global);
Application.MainFormOnTaskbar := True;
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TLoginForm, LoginForm);
Application.CreateForm(TConfigurationForm, ConfigurationForm);
//[snip] a bunch of other forms ...
Application.Run();
Run Code Online (Sandbox Code Playgroud)
所以,我的应用程序mainForm.CreateForm()发送UM_APPLICATION_START给自己是有意义的,在创建和初始化所有表单之前它不会处理(或者,我可以在调用之后调用消息从我的.DPR触发的fn()Application.Run();但是我更喜欢这个消息,因为它更明显 - 我很少看我的.DPR文件).