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次,印象应该是极其深刻的。。。但是往往到了实践阶段或多或少会犯些类似的错误。写这篇日志,记下一些东西,“记”下一些“东西”。
- listCtrl控件构造函数中用InsertColumn初始化 错误分析
- ListCtrl.InsertColumn和ListCtrl.InsertItem
- C++构造函数中用参数列表初始化成员
- 自定义控件的构造方法中用this出现的错误
- C++例题分析1 构造函数初始化
- MFC ListCtrl控件及CComboBox控件的初始化
- 构造函数+初始化函数
- MFC|ListCtrl中InsertColumn后标题不显示
- QT中用父类构造函数初始化子类的成员变量
- QT中用父类构造函数初始化子类的成员变量
- C++中的构造函数初始化列表的使用和分析
- C++构造函数初始化问题的浅分析
- 构造函数初始化器
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数的初始化
- GDUFS1146 Banana Game 博弈问题
- Oracle 数据库笔记1
- Pku 1067 取石子游戏
- 全手动连接Filter Graph
- 一些有用的dos命令
- listCtrl控件构造函数中用InsertColumn初始化 错误分析
- 再次感受vim的强大 || tap 键 设置
- SQL基础
- ExtJS 自定义事件学习
- Oracle的sql语句
- VS2005/2008问题之——由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题
- Java设计模式—singleton 单例
- TheTechBehindDx11UnrealEngine"Samaritan"Demo
- Oracle 数据库笔记2