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

2023-11-30

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

我可以做什么——和不可以做什么——FormCreate()?

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

我问的原因是我偶然发现了一个旧项目,我的FormCreate()简单地包括

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

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

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

任何人都可以声明或引用一个链接,其中声明了对一个人可以执行的操作的任何限制FormCreate()?


[更新] 我认为 David sHefferman 在写道“应用程序开始泵送消息。当您在 .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在创建并初始化所有表单之前它不会处理它本身(或者,我可以调用 fn() ,消息从我的 .DPR 中触发)Application.Run()叫做;但我更喜欢这个消息,因为它更明显 - 我很少查看我的 .DPR 文件)。


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

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

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

另一行代码是合理的:

PostMessage(Handle, UM_PROGRAM_START, 0, 0);

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 FormCreate() 中我可以做什么,不可以做什么? 的相关文章

  • 如何仅使用 TADOQuery 组件将图像插入数据库

    我有一个简单的基本问题 我正在尝试使用将图像插入数据库Insert与其他列值的语句也使用TADOQuery成分 由于代码已经由某人编写 因此我想在此处放置一些虚拟示例代码 以供您澄清相应的步骤 请注意 这可以正常工作TQuery组件 因为我
  • 如何遍历任意给定集合中的枚举?

    我有很多枚举类型 它们与相应的集合相结合 例如 type TMyEnum meOne meTwo meThree TMyEnums set of TMyEnum 我正在尝试提出一组可以运行的函数any枚举集 而不是为每个枚举编写单独的函数
  • TOpenDialog/NSOpenPanel 无法在沙盒 Delphi 应用程序中工作

    Firemonkey 应用程序中的 TOpenDialog 似乎存在问题 该应用程序已针对 Mac Appstore 进行沙箱处理 我使用XE3 但它也存在于XE2中 我其实在这里找到了一份QC报告 但仍然没有解决 http qc emba
  • 每次 TDbGrid 的选定位置更改时都会触发什么事件?

    我的项目中有一个 TDbGrid 每次更改所选行时我都试图触发一个事件 行中的任何更改都已经更新了链接到同一数据源的所有数据感知控件 但还需要进行其他更改 我需要一个事件处理程序 我认为 OnColEnter 会起作用 根据帮助文件 它在以
  • 为什么 {$ifopt FINITEFLOAT ON} 无法编译?

    我有这样的构造 ifopt FINITEFLOAT ON message FINITEFLOAT option ON else message FINITEFLOAT option OFF endif 在我的源代码中 它不会编译 这一定是一
  • 如何从 VCL.Graphics 获取所有已注册的文件格式...但 64 位

    在我的 32 位应用程序中 我使用FindRegisteredPictureFileFormats 单元由 Cosmin Prund 提供 https stackoverflow com a 14677532 505088 gt 如何从图形
  • Delphi IDE导致CPU过热

    我正在使用 Delphi 7 但我已经尝试过 Delphi 2005 2010 版本 在所有这些新版本中 当 Delphi IDE 在屏幕上可见时 我的 CPU 利用率为 50 一个核心为 100 另一个核心为 宽松 当 IDE 最小化时
  • 如何更改 TPageControl 上标签的方向?

    我是 Delphi 的新手 再次强调 我在 1994 年就使用过 Delphi 我现在有 Delphi 2009 Pro 来自Java 我发现对象继承非常晦涩 我的用户想要选项卡位于左侧的选项卡式页面 但是 TPageControl 不允许
  • Mac 上的 Delphi - 可能吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我负责一个 Delphi Win32 项目管理应用程序 我刚刚完成了向 Delphi 2009 的迁移
  • TListView 中的中心子项目图像

    Is it possible to fix the drawing of subitem images in a TListView so that they are not cut off on the left hand side as
  • 供所有 Win32 程序员在 Windows Aero Glass(DWM、GDI、GDI+)上绘图的文档和 API 示例

    我正在寻找良好的资源来学习使用 Win32 GDI API 或任何替代它的内容 以便使用 Win32 API 直接在玻璃窗体上进行绘制和绘制 当我使用 Delphi 时 我将其标记为 Delphi 或 Visual C 您能找到的任何代码示
  • 任意通用列表的通配符

    我有一个类 MyClass 它不是通用的 包含任意 TList 并对其执行某些操作 我希望用通用 TList 替换 TList 但 MyClass 必须保持非通用 由于 Delphi 是不变的 这样的事情是行不通的 list1 TList
  • 可以在滚动条上绘画吗?

    是否可以在 TMemo TListbox 等标准控件的滚动条上进行绘制 我所需要的只是在滚动条上绘制一些基本形状 并且我试图避免从 stratch 实现整个滚动内容 有什么指点吗 蒂亚 确实有可能 你可能想看一下WM NCPAINT消息 这
  • Delphi定时器比毫秒更精确

    我在 Delphi 中有一个程序 它以 25 赫兹 每秒 25 次 的速度从外部应用程序获取帧 然后通过创建 1 2 个额外帧将其转换为 60 赫兹 每秒 60 帧 我需要通过连续构建帧缓冲区并从单独的线程输出帧来输出这些额外的帧 问题是
  • 当系统文件实际存在时找不到它

    系统找不到alg exe但它确实存在 c windows system32 alg exe 我最近从 Win 7 x86 迁移到 x64 当我使用 x86 时 我对此没有任何问题 尝试了 Delphi 7 和 XE2 我正在使用的代码 if
  • 如何改变TDateTimePicker的颜色?

    如何更改 a 的颜色TDateTimePicker A 日期和时间选择器可以有一种颜色 通常这是通过设置来完成的Color procedure TForm1 FormCreate Sender TObject begin DateTimeP
  • 在这些情况下限制破折号的正则表达式模式

    Scenario 我正在使用第三方文件重命名软件 该软件是用 Delphi 编写的 并且具有 pascal 脚本支持 该应用程序允许使用正则表达式来重命名文件 这意味着 如果我需要对文件名执行的操作不能仅使用一个正则表达式来完成 那么我可以
  • 惠普定制 OEM Windows 上的 Delphi 平台错误

    我在设置我的计算机以便运行 Delphi 时不断遇到相同的错误 我已经在PLATFORM环境变量 将其转换为 win32 但仍然给出相同的错误 错误错误 平台变量 HPD 无效 PLATFORM 必须是以下之一 Win32 Win64 An
  • 在Delphi/Lazarus中设置提示窗口(THintWindow)的大小

    我正在尝试在 Lazarus 中进行自定义提示 到目前为止 我已经动态加载了提示中的文本 并自定义了字体 字体大小和字体颜色 我想限制提示窗口的宽度 有任何想法吗 这是我的代码 type TExHint class THintWindow
  • 良好的 Delphi Prism 在线资源

    在 Google 上搜索 delphi prism delphi prism 资源 或 delphi prism 代码片段 几乎找不到好的网站 是否有任何好的编程网站提供大量有关 Delphi Prism 的代码片段和教程 提前致谢 oma

随机推荐