VC毕业设计,就差一点了

蓝鹰 2012-04-21 08:02:06
我做了一个饭卡管理系统,主界面上用的是非模态对话框,程序运行已经比较稳定了,功能也实现了,甚至超出了毕业设计要求,但是从头到尾困扰我的问题还没有解决:当程序关闭的时,也就是我按主界面上的叉的时候,编译器会报错!说什么访问冲突!

我的类是这样的结构,首先一个CERPView:CView, 然后这个CERPVIEW下有一个CardView指针,当用户登录成功后,会通过
CardView =new CCardViewDlg();
CardView.Create(IDD_CARDVIEW,this);
来创建单文档界面(CERPView)下的主对话框,对话框上面有一些ado控件,然而就在我关闭单文档界面的时候,程序就报错了,程序甚至连主视图CERPView和子窗体(CardView)的析构函数都未执行,而且也没来得及触发onclose事件,大家帮我看看这究竟是怎么回事啊?这是否和那几个ado控件有关?如何才能把窗体卸载干净?

int CFERPView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{


if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
setting.Load(); //加载设置

loginDlog login(&setting); //登录窗体

if(login.DoModal()!=IDOK)
return -1;

CardView=new CCardViewDlog(&setting); //主窗体对象创建
return 0;
}


void CFERPView::OnShowWindow(BOOL bShow, UINT nStatus)
{
CView::OnShowWindow(bShow, nStatus); //创建主窗体
CardView->Create(IDD_CARD_VIEW,this);
if(setting.ifInfCard==TRUE)
CardView->ShowInfCard(this);
if(setting.ifAutoMt==TRUE)
{
CButton *check=(CButton*)CardView->GetDlgItem(IDC_AUTOMATCH);
check->SetCheck(TRUE);
}
}


...全文
278 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝鹰 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

我之前弄过类似的对话框,不过对话框还是有OK按钮的,我在OnOK中调用DestroyWindow();然后在OnDestroy()中delete this了。
或者你在关闭视图的OnClose消息中向对话框发送OnDestroy消息。
[/Quote]那个例子能否贴出来看看啊?
蓝鹰 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

检查所有的析构函数和控制关闭的控件,看是否对new过的变量(和打开的窗口)没有deleted掉(对窗口没有destory或者deleted),同时注意数组的deleted方法。
检查所有自己声明的变量,是否没有初始化(我想这是主要原因)。打开汇编窗口和内存窗口,查看报错的那个地方对应的内存是哪儿,查看是否真的冲突。
[/Quote]能否给个完整的,使用非模态对话框的程序例子?
忘世麒麟 2012-04-22
  • 打赏
  • 举报
回复
检查所有的析构函数和控制关闭的控件,看是否对new过的变量(和打开的窗口)没有deleted掉(对窗口没有destory或者deleted),同时注意数组的deleted方法。
检查所有自己声明的变量,是否没有初始化(我想这是主要原因)。打开汇编窗口和内存窗口,查看报错的那个地方对应的内存是哪儿,查看是否真的冲突。
shn521 2012-04-22
  • 打赏
  • 举报
回复
1。先屏蔽部分代码再找错误。
2. 调试
cattycat 2012-04-22
  • 打赏
  • 举报
回复
我之前弄过类似的对话框,不过对话框还是有OK按钮的,我在OnOK中调用DestroyWindow();然后在OnDestroy()中delete this了。
或者你在关闭视图的OnClose消息中向对话框发送OnDestroy消息。
蓝鹰 2012-04-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

非模态对话框,一般都要求:
1.使用的时候,Dialog* pd = new Dialog;

2.销毁对话框时,需要手动调用OnDestroy()函数;

3.对话框销毁后,需要在PostNcDestroy事件之后删除自己,而不是在外部delete(这样很繁琐):
virtual void PostNcDestroy (){CDialog::PostNcDestroy(); d……
[/Quote]

MSDN上是这样说的,但是,它好像说前提是pd指针是其他类的成员变量,貌似删除时会出错。
super_admi 2012-04-22
  • 打赏
  • 举报
回复
修正一下:上面:2.销毁对话框时,手动调用DestroyWindow()
super_admi 2012-04-22
  • 打赏
  • 举报
回复
非模态对话框,一般都要求:
1.使用的时候,Dialog* pd = new Dialog;

2.销毁对话框时,需要手动调用OnDestroy()函数;

3.对话框销毁后,需要在PostNcDestroy事件之后删除自己,而不是在外部delete(这样很繁琐):
virtual void PostNcDestroy (){CDialog::PostNcDestroy(); delete this;}
cattycat 2012-04-22
  • 打赏
  • 举报
回复
你自己有没有重载CardView的OnClose和OnDestroy事件?这个不是先关闭CardView再关闭CERPView的么。在一些地方加一些MessageBox等弹出窗口的,你就可以知道问题具体在哪。
蓝鹰 2012-04-22
  • 打赏
  • 举报
回复
我在所有窗体的onclose和ondestroy事件和析构函数上都打上断点了,程序就是没有击中断点
蓝鹰 2012-04-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

难道是 析构顺序不对?
lz把最后 释放资源销毁对象的代码都注释了试试?
[/Quote]对与多个窗体,析构顺序是怎样的?关键是我现在任何窗体的析构函数都执行不了,程序还没有触发ONclose和ONdestroy事件就报错了,这真的很诡异!难道和我用的adodc控件有关?这些东西需要手动销毁吗?
蓝鹰 2012-04-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

报的错是什么...
[/Quote]我按关闭按钮关闭整个程序的时候,出现内存访问冲突,此时,CERPView和CardView的析构函数都没执行。也没触发任何窗体的onclose事件,更没有触发ondestroy事件
evencoming 2012-04-22
  • 打赏
  • 举报
回复
难道是 析构顺序不对?
lz把最后 释放资源销毁对象的代码都注释了试试?
project2502 2012-04-22
  • 打赏
  • 举报
回复
报的错是什么...
wangsiyuanoo 2012-04-22
  • 打赏
  • 举报
回复
建议使用排除法
把你觉得有问题的代码都注释掉
很快就会知道到底错在哪了
然后再对症下药
蓝鹰 2012-04-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 8 楼 的回复:

非模态对话框,一般都要求:
1.使用的时候,Dialog* pd = new Dialog;

2.销毁对话框时,需要手动调用OnDestroy()函数;

3.对话框销毁后,需要在PostNcDestroy事件之后删除自己,而不是在外部delete(这样很繁琐):
virtual void PostNcDestroy (){CDialog::Po……
[/Quote]MSDN上是这样说的,但是,它说前提是:“pd指针不是其他类的成员变量或者与其他对象不存在某些特殊关系。”貌似删除时会出错。
水仙花数的vfp实现 时间:2009-05-08来源:编程入门网 作者:老马   本文作者“老马”为编程入门网VFP专栏作家,转载请保留这句话。   记得看过朋友的文章中有句话大致是这个意思:一个人编程的水平与实现同一目的所需的代码数量成反比。其实这句话很有道理,如果用这个观点来评价我自己,我应该是一个苍老的菜鸟,我做出来的东西勉强可用,但代码在高手看来却是惨不忍睹。我所走过的轨迹与常人大概也有所不同:计算机专业科班的可能在毕业后从事coding多年之后,当感觉自己力不从心时转行做管理或教师;而我恰恰相反,外贸专业毕业后狂热地自学了一些东西,教了几年C语言、vb、vfp及asp等课程,几乎所有的业余时间都用到了接活来做上,这一点也差不多达到了狂热的程度。不过后来发现自己似乎是走进了死胡同:我试图走进VC的世界,可是被MFC、SDK这些东西折磨得痛苦之极;当我为自己开始能用asp做些东西而沾沾自喜的时候,一个强调代码与界面分离的asp.net一天比一天时髦起来,而它的身后是一个.NET家族。更新的技术何时出现?天知道,或许就在明天。我终于开始明白,我实际并不象身边的人说的那样聪明,我也只是一个平庸的人;我终于开始明白,如果在我所从事的这个没有任何保障的“挨踢”行业继续做下去,过几年我会成为40、50人员,那时恐怕连愿意为我交社保、医保的地方都找不到了。所以现在我进入了企业,不再是教师,因为这需要很大的精力来证明自己的能力和水平;也不再为了些“水票管理”之类的东西而通宵达旦,因为这样做得到的是几个小钱,失去的却是最宝贵的健康。   今天和几个高中同学小聚了一下,或许是人岁数大了愿意回忆从前的事,或许是还有些酒意,所以有了上面的这一段话。不过我想这不应该算是牢骚,应该说是一个菜鸟对自己的可笑经历的总结。   我始终认为C语言是一个基础性的语言,以前无论是VB或VFP课,我总会要求同学自己找本谭浩强的《C程序设计》,把预处理命令、指针、结构体与共用体等几部分内容pass过去,阅读其基础部分的内容;而在课时充足的情况下,我也会经常拿C程序书中诸如“鸡兔同笼”这样有趣的题来“折磨”一下班上的同学。   而现在有些日子了,有两个高中同学总跑到我家里来。人活到老、学到老,这本是件好事,不过我还是有些苦恼。因为他们到我家里来学习,不仅不交学费,我还得管他们饭。他们问到的vfp的东西比较多,所以我打算继续把这方面的一些东西翻出来晒晒。从本文开始会探讨一下C程序书中比较经典的几个算法在VFP中实现的问题,当然纯属菜鸟之见,有没有用那可两说,得自己去分析。觉得有用的话,或许可以开拓思路、扩充您的知识面,我很高兴;觉得没用的话,您权当我是吃撑了,您能忍受我罗嗦了这么长时间,我一样很高兴,呵呵。   水仙花数的实现是一个比较经典的算法题,今天我们首先在vfp中来实现它。   首先我们了解一下什么是“水仙花数”。所谓水仙花数是指一个n位数,其各位数字立方和等于该数本身的值,例如:153=13+53+33 ,所以153是一个水仙花数。   我们来做一个简单点儿的:求解3位数的水仙花数,即100至999之间的水仙花数。很明显这个程序需要使用循环,并且从水仙花数的概念可知,其重点是求解出循环变量当前值的各位数字的值。剩下的工作就简单了,把求解出的各位数字的立方和与循环变量当前值进行比较,如果相等则说明这是一个水仙花数,输出它即可。相关说明见代码注释。本文发表于编程入门网:www.bianceng.cn   我们用表单来实现这个例子,运行时如下图:   参照上图开始我们的制作:   一、新建表单,向表单上添加一个标签控件,caption属性值设置为“显示100到999间的水仙花数”;添加两个命令按钮command1和command2,并将它们的caption属性值分别设置为“开始”和“清除”;添加一个编辑框控件Edit1,属性值均采用默认的。   二、添加事件代码:   1、“清除”按钮的click事件: thisform.edit1.value="" thisform.refresh   2、“开始”按钮的click事件: local i,a,b,c for i=100 to 999 a=int(i/100) &&百位的值等于这个三位数除以100后取整 b=int((i-100*a)/10) &&用这个三位数减去它的百位数字与100乘积, &&对得到的差除以10后进行取整,结果就是十位的值 c=i-int(i/10)*10 &&与上面原理相同,这是求个位的值 if i=a^3+b^3+c^3 &&成立说明是水仙花数并输出 thisform.edit1.value=thisform.edit1.value+str(i,5)+chr(13) &&用chr(13)换行 endif endfor
水仙花数的vfp实现 时间:2009-05-08来源:编程入门网 作者:老马   本文作者“老马”为编程入门网VFP专栏作家,转载请保留这句话。   记得看过朋友的文章中有句话大致是这个意思:一个人编程的水平与实现同一目的所需的代码数量成反比。其实这句话很有道理,如果用这个观点来评价我自己,我应该是一个苍老的菜鸟,我做出来的东西勉强可用,但代码在高手看来却是惨不忍睹。我所走过的轨迹与常人大概也有所不同:计算机专业科班的可能在毕业后从事coding多年之后,当感觉自己力不从心时转行做管理或教师;而我恰恰相反,外贸专业毕业后狂热地自学了一些东西,教了几年C语言、vb、vfp及asp等课程,几乎所有的业余时间都用到了接活来做上,这一点也差不多达到了狂热的程度。不过后来发现自己似乎是走进了死胡同:我试图走进VC的世界,可是被MFC、SDK这些东西折磨得痛苦之极;当我为自己开始能用asp做些东西而沾沾自喜的时候,一个强调代码与界面分离的asp.net一天比一天时髦起来,而它的身后是一个.NET家族。更新的技术何时出现?天知道,或许就在明天。我终于开始明白,我实际并不象身边的人说的那样聪明,我也只是一个平庸的人;我终于开始明白,如果在我所从事的这个没有任何保障的“挨踢”行业继续做下去,过几年我会成为40、50人员,那时恐怕连愿意为我交社保、医保的地方都找不到了。所以现在我进入了企业,不再是教师,因为这需要很大的精力来证明自己的能力和水平;也不再为了些“水票管理”之类的东西而通宵达旦,因为这样做得到的是几个小钱,失去的却是最宝贵的健康。   今天和几个高中同学小聚了一下,或许是人岁数大了愿意回忆从前的事,或许是还有些酒意,所以有了上面的这一段话。不过我想这不应该算是牢骚,应该说是一个菜鸟对自己的可笑经历的总结。   我始终认为C语言是一个基础性的语言,以前无论是VB或VFP课,我总会要求同学自己找本谭浩强的《C程序设计》,把预处理命令、指针、结构体与共用体等几部分内容pass过去,阅读其基础部分的内容;而在课时充足的情况下,我也会经常拿C程序书中诸如“鸡兔同笼”这样有趣的题来“折磨”一下班上的同学。   而现在有些日子了,有两个高中同学总跑到我家里来。人活到老、学到老,这本是件好事,不过我还是有些苦恼。因为他们到我家里来学习,不仅不交学费,我还得管他们饭。他们问到的vfp的东西比较多,所以我打算继续把这方面的一些东西翻出来晒晒。从本文开始会探讨一下C程序书中比较经典的几个算法在VFP中实现的问题,当然纯属菜鸟之见,有没有用那可两说,得自己去分析。觉得有用的话,或许可以开拓思路、扩充您的知识面,我很高兴;觉得没用的话,您权当我是吃撑了,您能忍受我罗嗦了这么长时间,我一样很高兴,呵呵。   水仙花数的实现是一个比较经典的算法题,今天我们首先在vfp中来实现它。   首先我们了解一下什么是“水仙花数”。所谓水仙花数是指一个n位数,其各位数字立方和等于该数本身的值,例如:153=13+53+33 ,所以153是一个水仙花数。   我们来做一个简单点儿的:求解3位数的水仙花数,即100至999之间的水仙花数。很明显这个程序需要使用循环,并且从水仙花数的概念可知,其重点是求解出循环变量当前值的各位数字的值。剩下的工作就简单了,把求解出的各位数字的立方和与循环变量当前值进行比较,如果相等则说明这是一个水仙花数,输出它即可。相关说明见代码注释。本文发表于编程入门网:www.bianceng.cn   我们用表单来实现这个例子,运行时如下图:   参照上图开始我们的制作:   一、新建表单,向表单上添加一个标签控件,caption属性值设置为“显示100到999间的水仙花数”;添加两个命令按钮command1和command2,并将它们的caption属性值分别设置为“开始”和“清除”;添加一个编辑框控件Edit1,属性值均采用默认的。   二、添加事件代码:   1、“清除”按钮的click事件: thisform.edit1.value="" thisform.refresh   2、“开始”按钮的click事件: local i,a,b,c for i=100 to 999 a=int(i/100) &&百位的值等于这个三位数除以100后取整 b=int((i-100*a)/10) &&用这个三位数减去它的百位数字与100乘积, &&对得到的差除以10后进行取整,结果就是十位的值 c=i-int(i/10)*10 &&与上面原理相同,这是求个位的值 if i=a^3+b^3+c^3 &&成立说明是水仙花数并输出 thisform.edit1.value=thisform.edit1.value+str(i,5)+chr(13) &&用chr(13)换行 endif endfor

64,677

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧