表单 – Delphi:应用程序初始化 – 最佳实践/方法

我经常遇到这种情况,我只是在寻找最佳实践/方法.我有一个包含数据库/数据模块的应用程序,并且想要在启动时启动数据库/数据集,而不是在设计时将“运行时活动”设置为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);

我想不出一次这个消息从未被处理过,但是调用的本质是它被添加到消息队列中,如果队列已满,则它被“丢弃”.请注意边缘情况存在.

相关文章

vue阻止冒泡事件 阻止点击事件的执行 <div @click=&a...
尝试过使用网友说的API接口获取 找到的都是失效了 暂时就使用...
后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name:...
JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简...
Mip是什么意思以及作用有哪些