gpt4 book ai didi

delphi - 在 FormCreate() 中我可以做什么,不可以做什么?

转载 作者:行者123 更新时间:2023-12-03 15:39:55 25 4
gpt4 key购买 nike

我认为这一定是一个常见问题解答,但谷歌搜索并没有真正帮助。

FormCreate() 中我可以做什么,不可以做什么?

我想知道表单的所有子控件是否都已完全创建并可供访问等。

我问的原因是我偶然发现了一个旧项目,其中我的 FormCreate() 仅由

Sleep(1000);  
PostMessage(Handle, UM_PROGRAM_START, 0, 0);

看来我想“稍等一下”,然后“当事情稳定下来时”进行一些初始化......

当时我当然有这样做的理由(?),但是,在没有启发性评论的情况下,我无法记忆起为什么我认为这是必要的。

任何人都可以说明或引用说明对 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();

因此,我的应用程序的 mainForm.CreateForm() 向自身发送 UM_APPLICATION_START 是有意义的,在创建并初始化所有表单之前它不会处理它(或者,我可以在调用 Application.Run() 后调用消息从我的 .DPR 触发的 fn();但我更喜欢该消息,因为它更明显 - 我很少看我的.DPR 文件)。

最佳答案

没有明确的文档列出您在表单的 OnCreate 中可以执行和不能执行的所有操作。

至于 .dfm 文件是否已被处理以及所有表单拥有的组件是否已创建,是的。

我不会在您找到的代码中放置太多内容。在启动过程中调用Sleep,让主线程等待,绝对不是一个好的做法。如果代码想要等待另一个线程,它可以阻塞该线程,或者等待从该线程获取消息。这看起来就像是由不明白他/她在做什么的人输入的代码。而且代码从未被删除。

另一行代码是合理的:

PostMessage(Handle, UM_PROGRAM_START, 0, 0);

由于此消息已发布,因此在应用程序开始发送消息之前不会对其进行处理。当您在 .dpr 文件中调用 Application.Run 时,就会发生这种情况。这意味着与创建主表单相关的所有事情都发生在该消息从队列中拉出之前。

关于delphi - 在 FormCreate() 中我可以做什么,不可以做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13411796/

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