listCtrl控件构造函数中用InsertColumn初始化 错误分析

来源:互联网 发布:中国近现代报刊数据库 编辑:程序博客网 时间:2024/05/18 02:12

换了VS2008,在代码的移植和继续开发中遇到了一个蛋疼的问题,折腾一番,有所心得。

******************************************************

  背景:继续开发基于MFC物联网系统的后台系统

  环境:Visual Studio 2008

  问题:ListCtrl控件的多列初始化,编译连接无错,运行出错,

        (一般都是内存为空的问题,说白就是对象未创建而调用,或者调用已经销毁的对象)

 *****************************************************

为后台系统设计了一个专门的SmsManager 短信管理Part

 先说明一下,程序要实现的效果,附图:


就是在ListCtrl中添加一些用户信息,因为需要一些关联性的信息,所以没有选用ListBox控件,ListCtrl可以多列显示。

第一次,设计好窗口之后,很自然的添加如下代码,创建模态窗口

       CDlgSMS sms;

       sms.DoMadol();

窗口的构造函数如下: m_listCtrl  为CDlgSMS的一个控件类型成员变量

CDlgSMS::CDlgSMS(){

        m_listCtrl.InsertColumn(0,"姓名",LVCFMT_LEFT,50);

         m_listCtrl.InsertColumn(1,"手机",LVCFMT_LEFT,50);

         m_listCtrl.InsertColumn(2,"备注",LVCFMT_LEFT,50);

}

编译连接OK,运行报错!就是常见的那种弹出一个警告对话框的那种。因为对于这种情况有些经验,所以觉得是内存问题,对象未创建之类的原因。

        CDlgSMS sms;   这里是调用默认构造函数,

        sms.DoMadol();  创建模态对话框

琢磨了一下,觉得应该是对话框为创建之前,成员变量还不能与控件关联,所以调用

m_listCtrl.InsertColumn()这个函数之时,没有控件与之对应        

      //以上是个人理解  有不同意的尽可提出           

     下一步我就知道脑子怎么想了,创建非模态的对话框,印象中非模态貌似比模态的牛逼一些,就是作用域的不同,非模态好像是使用堆栈内存,与程序共存亡,而模态和一般变量的规律差不多。

 代码如下:

       CDlgSMS * psms= new CDlgSMS;

       psms->Create(IDD_DLGSMS,this);

       psms->ShowWindow(SW_NORMAL);

运行,编译连接OK,运行 错误。。。。SHIT!

      回头看了下代码,发现和模态的其实是一样的,m_listCtrl.InsertColumn()是在构造函数中调用的,总是在窗口创建之前就执行了,o(︶︿︶)o唉。。。。

      然后想了想只能在窗口创建之后初始化,自然也就想到了OnInitDialog()这个函数,这个是继承于基类CDialog的窗口初始化函数,如果单步调试,我们会发现在构造函数执行完,Create函数之后就会执行OnInitDialog()这个函数,符合要求。

      由于自己创建的窗口类一般没有OnInitDialog这个函数,需要自己重载,所以下一步就是在类中添加重载函数,就是添加一个一样名字的成员函数。

     BOOL CDlgSMS::OnInitDialog(void){

           m_listCtrl.InsertColumn(0,"姓名",LVCFMT_LEFT,50);

            m_listCtrl.InsertColumn(1,"手机",LVCFMT_LEFT,50);

           m_listCtrl.InsertColumn(2,"备注",LVCFMT_LEFT,50);

    }

这样就应没有问题了,编译OK~ 连接 OK~  执行 ~  SHIT!!!!!!

     报错了。。。。(@﹏@)~   检查了觉得没错,反复看了约半个小时,把自带的OnInitDialog函数打开一看。。。

    BOOL CTemp_humidityDlg::OnInitDialog(){

              CDialog::OnInitDialog();
      // Add "About..." menu item to system menu.
      // IDM_ABOUTBOX must be in the system command range.

      //SNIP

    }

额。。。重载之前要先将基类的窗口初始化。。。

     BOOL CDlgSMS::OnInitDialog(void){

           CDialog::OnInitDialog();

           m_listCtrl.InsertColumn(0,"姓名",LVCFMT_LEFT,50);

           m_listCtrl.InsertColumn(1,"手机",LVCFMT_LEFT,50);

           m_listCtrl.InsertColumn(2,"备注",LVCFMT_LEFT,50);

    }

编译  OK 

连接  OK

运行  OK 

问题是解决了,但话说回来,这个错误应该是很低级的一个,因为考试的时候多态、重载、基类、子类等等知识点错了不下N次,印象应该是极其深刻的。。。但是往往到了实践阶段或多或少会犯些类似的错误。写这篇日志,记下一些东西,“记”下一些“东西”。

原创粉丝点击