这个,实际我也不知道这个标题该怎么写。因为用一句话描述错误有点困难。
下面用代码来说明吧。
最近做了一个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。因此,没有创建对象就调用的错误就发生了。