我经常遇到这个,我只是在寻找最佳实践/方法.我有一个包含数据库/数据模块的应用程序,并且想要在启动时启动数据库/数据集,而在设计时将"运行时活动"设置为true(数据库位置不同).当应用程序启动时,还运行Web"检查更新"例程.
给定TForm事件序列,以及各种试错的结果,我目前正在使用这种方法:
我使用在主窗体中设置的"Globals"记录来存储所有全局变量,有一个名为Globals.AppInitialized(boolean)的元素,并在主窗体的Initialization部分将其设置为False.
在主窗体的OnShow事件中(所有窗体都是由那时创建的),我测试了Globals.AppInitialized; 如果它是假的,我运行我的"初始化"的东西,然后通过设置Globals.AppInitialized:= True完成.
这看起来效果很好,但这是最好的方法吗?寻找别人的经验,想法和意见的见解.TIA ..
我通常总是关闭主表单和主数据模块的所有表单的自动创建除外.
我学到的一个技巧是将数据模块添加到项目中,允许它在主窗体之前自动创建和创建.然后,在创建主窗体时,数据模块的onCreate将已经运行.
如果您的应用程序有一些代码要说,请设置控件的焦点(在创建时无法做到的事情,因为它"尚未显示")然后创建用户消息并将其发布到oncreate中的表单中.一旦处理了表单消息循环,就应该处理该消息(不保证).例如:
const wm_AppStarted = wm_User + 101; type Form1 = class(tForm) : procedure wmAppStarted(var Msg:tMessage); message wm_AppStarted; end; // in your oncreate event add the following, which should result in your wmAppStarted event firing. PostMessage(handle,wm_AppStarted,0,0);
我想不出一次这个消息从未被处理过,但是调用的本质是它被添加到消息队列中,如果队列已满,则它被"丢弃".请注意边缘情况存在.
您可能希望在表单创建调用之后和Application.Run之前直接干扰项目源(.dpr文件).(甚至更早的情况.)
这就是我通常处理这种初始化的方法:
... Application.CreateForm(TMainForm, MainForm); ... MainForm.ApplicationLoaded; // loads options, etc.. Application.Run; ...