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


     

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

    下面用代码来说明吧。

    最近做了一个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。因此,没有创建对象就调用的错误就发生了。

  • 相关阅读:
    重读数据结构——严蔚敏C语言版
    Tcp/Ip网络通讯初探
    XMLHttpRequest post 传递多个参数及服务器端读取
    HDOJ 1106 排序 (字符串处理)
    用Java创建数组工具类ArrayTool
    自己动手编写一个VS插件(三)——创建工具栏之一
    「译」JavaScript 的怪癖 1:隐式类型转换
    javascript 中强制执行 toString()
    VS 2008的64位编译环境的安装和使用
    计算机神书『编码:隐匿在计算机软硬件背后的语言』
  • 原文地址:https://www.cnblogs.com/moonwind/p/4468947.html
Copyright © 2020-2023  润新知