我认为这必须是一个常见问题,但谷歌搜寻并没有真正的帮助。FormCreate()中可能做什么和不做什么?
我该做什么 - 可能不会 - 在FormCreate()
?
如果所有形式的子控件的完全创建并可供访问我在想,等
我想问的原因是,我偶然发现了一个旧的项目中,我FormCreate()
只是由
Sleep(1000);
PostMessage(Handle, UM_PROGRAM_START, 0, 0);
看来,我想“稍等一下”,然后做一些初始化“当事情已经安定下来” ......
我一定有它的理由的时候(?),但是,在我缺乏启发性的评论无法回想为什么我觉得这是必要的。
任何人都可以陈述或引用一个链接,指出在FormCreate()
中可以做什么的任何限制?
[更新]我想thta 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();
因此,它是有道理的,我的应用程序的mainForm.CreateForm()
送UM_APPLICATION_START
本身它不会处理,直到创建了所有形式&已初始化(或者,我可以在调用Application.Run()
之后调用从.DPR触发的消息的fn();但我更喜欢消息,因为它更明显 - 我很少看到.DPR文件)。
看看你在UM_PROGRAM_START到达时所做的事情,这会让你明白理由。 – jachguate
创建ChildComponents后,OnCreate将被解雇。但取决于OldCreateOrder,它将在Create或AfterConstruction内部被触发。但是一些控件也可以使用PostMessage来执行它们的最终初始化,并且它们不能用于OnCreate事件。因此,您可能选择发布消息 - 是的,忘记睡眠:o) –