Delphi中主窗体的formshow事件在程序自动创建窗体对象前就调用的错误。

时间:2022-08-30 17:46:54
 

这个,实际我也不知道这个标题该怎么写。因为用一句话描述错误有点困难。

下面用代码来说明吧。

最近做了一个delphi的程序,按照我的习惯一般是先创建一个窗体作为主窗体,其他的窗体都在这个基础上显示。另外,由于使用了数据库,所以添加了一个TDataModule控件,便于一些不能防止控件的单元进行数据库操作。把其他所有的窗体都设置为非自动创建。然后通过application.createform方法进行动态创建和调用。

好了,问题出现了。

在工程文件中有如下代码:

    Application.CreateForm(TfrmMain, frmMain);
    Application.CreateForm(TDataM, DataM);
    Application.Run;

 

在frmMain中有FormShow方法,其中有一些初始化变量的函数和加载皮肤的代码。特别的是在初始化变量的函数中有一个使用

DataM.qry的语句。按理说在frmMain的FormShow方法中调用DataM对象是没有问题的。因为在上面的代码中已经创建了相应的对象。可是我在调试的时候不断的报错,提示就是无法找到DataM对象。真是太蹊跷了。

没办法,我只好把创建DataM的语句提到创建frmMain前面。程序倒是能够运行了,但是这个很不合理啊。 

 

同步不懈的努力,并且和之前备份的程序进行比较终于发现了错误所在。原来,Delphi显示主界面是通过 Application.Run来Show主窗体,而我在调试程序的时候不小心点击鼠标的时候把主窗体的Visible属性由正确的“false”改成了“true”。所以,一点程序执行了Application.CreateForm(TfrmMain, frmMain)的时候就要去Show这个窗口了,因为True么。没有创建DataM就Show,而Show调用DataM。因此,没有创建对象就调用的错误就发生了。