关于无模式对话框的创建
我用单击按钮,引发无模式对话框的创建,
CShipinDlg *dlg=new CShipinDlg;
dlg->Create(IDD_DIALOG1,NULL);
dlg->ShowWindow(SW_SHOW);
但是当我为按钮等控件添加变量之后,运行结果出错
Debug Aessertion Failed
忽略之后,出现“试图执行系统不支持操作”!
请问各位高手,究竟是什么问题?我模式对话框是不是有哪些特殊的属性/要求?
万分感谢!
问题点数:30、回复次数:39Top
1 楼iceneve(暗星云)回复于 2002-04-23 11:26:25 得分 25
假如CShipinDlg已经邦定到IDD_DIALOG1,
即CShipinDlg的构造函数调用了基类构造函数CDialog(IDD_DIALOG1,null),
则会出现Debug Aessertion Failed。
应该:
CShipinDlg::CShipinDlg(): CDialog()
{
}
然后重载虚函数Create()
return TRUE;即可Top
2 楼shan_hy()回复于 2002-04-23 11:36:58 得分 0
CShipinDlg *dlg=new CShipinDlg(this);Top
3 楼csdn_2002(vc小混混)回复于 2002-04-23 11:40:15 得分 0
楼上的,不对阿!我试过了!Top
4 楼iceneve(暗星云)回复于 2002-04-23 11:49:48 得分 0
class CViewDetailDlg : public CDialog
{
// Construction
public:
CViewDetailDlg(); // standard constructor
// Dialog Data
//{{AFX_DATA(CViewDetailDlg)
enum { IDD = IDD_VIEWDETAIL };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CViewDetailDlg)
public:
virtual BOOL Create(CWnd* pParentWnd = NULL);
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CViewDetailDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//////////////////////////////////////////////
///////////////////////////////////////////
CViewDetailDlg::CViewDetailDlg(): CDialog()
{
//{{AFX_DATA_INIT(CViewDetailDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
BOOL CViewDetailDlg::Create(CWnd* pParentWnd)
{
return CDialog::Create(IDD, pParentWnd);
}
可以了。
调用时:
CShipinDlg *dlg=new CShipinDlg;
dlg->Create(this);// or dlg->Create();
dlg->ShowWindow(SW_SHOW);
Top
5 楼lonelywood(独木)回复于 2002-04-23 15:04:57 得分 0
把这个函数加上
virtual BOOL Create(UINT nID, CWnd* pParentWnd = NULL);
BOOL CxxxxxDlg::Create(UINT nID, CWnd* pParentWnd)
{
return CDialog::Create(IDD, pParentWnd);
}
微软居然不自动生成这个函数,这是我烦微软的地方。Top
6 楼csdn_2002(vc小混混)回复于 2002-04-23 15:11:45 得分 0
看到答复,我很高兴,可是具体的操作,我还是不清楚。能再具体点嘛?多谢了!Top
7 楼bluecrest(高歌)回复于 2002-04-23 16:14:32 得分 0
CShipinDlg *dlg=new CShipinDlg;
dlg->Create(IDD_DIALOG1,NULL);
dlg->ShowWindow(SW_SHOW);
但是当我为按钮等控件添加变量之后,运行结果出错
Debug Aessertion Failed
//用editplus看看那一行错了,设置断点看看那一句错了
错误很好找的,你是不是在对象为产生时或者析构掉时去赋值或者其他操作
Top
8 楼csdn_2002(vc小混混)回复于 2002-04-24 10:14:57 得分 0
因为编译什么的都没错啊!我怀疑还是无模式对话框的创建出了问题!我留意了一下以前的提问,类似的问题也很多啊!希望了解的高手给点意见啊!我再把问题说一下!
先定义全局变量 CShipinDlg *dlg;
初始化中:dlg=new CShipinDlg;
dlg->Create(IDD_DIALOG1,NULL);
dlg->ShowWindow(SW_SHOW);
运行后,单击按钮,无对话框出现,反而出现Debug Assertion Failed错误!
希望大家帮忙!Top
9 楼shan_hy()回复于 2002-04-24 12:21:21 得分 0
对话框属性中的visible选项你选了没有,如果没选,对话框出不来的Top
10 楼csdn_2002(vc小混混)回复于 2002-04-24 12:25:51 得分 0
不是啊!主要是Debug Assertion Failed错误!
究竟是什么原因啊!大家救命啊!Top
11 楼ls(ls)回复于 2002-04-24 12:29:47 得分 0
其实很简单的
你的这句:dlg->Create(IDD_DIALOG1,NULL);
有问题呀,第二个参数不能为空,他是指你要创建的窗体的父窗体,所以这里应该是父窗体的指针;比如,你是要给当前窗体创建的话,可以给 this 就行了
"对话框属性中的visible选项你选了没有,如果没选,对话框出不来的"也是必须的Top
12 楼pRiCH()回复于 2002-04-24 12:37:58 得分 0
直接new ***(this)
然后this指针就是父窗口,也就是你的view
然后后面的null就不要了
Top
13 楼pRiCH()回复于 2002-04-24 12:39:42 得分 0
你在创建的时候,给他new CShipinDlg(this);
然后this就是你的父窗口指针,也就是你的工作view
然后后面的null就不要了Top
14 楼csdn_2002(vc小混混)回复于 2002-04-24 12:40:53 得分 0
楼上的,我照着做了,可还是不行啊!还有什么办法呢?Top
15 楼King_Play(程序猎人)回复于 2002-04-24 12:49:58 得分 0
我用单击按钮,引发无模式对话框的创建,
CShipinDlg *dlg=new CShipinDlg;
dlg->Create(IDD_DIALOG1,NULL);
dlg->ShowWindow(SW_SHOW);
但是当我为按钮等控件添加变量之后,运行结果出错
~~~~~~~~~~~~~~~~~~~~~~~~~~~
你是指为你单击的按钮添加变量还是你要弹出的按钮?
我曾经使用无模式对话框和你的方法完全一样,没有一点儿问题呀。
不过我的无模式对话框中的控件都没有映射变量。Top
16 楼csdn_2002(vc小混混)回复于 2002-04-24 12:54:14 得分 0
楼上的,是这样的!
我的程序在没添加变量之前也是可以的!但是我不得不添加变量,现在就遇到了这个问题!
大家说的我都一一试过了,但还是这样,希望大家再帮我想想!多谢了!Top
17 楼yu_hl(卖柴火的小男孩)回复于 2002-04-24 12:58:51 得分 0
把代码给我。
hlyu@mail.ustc.edu.cnTop
18 楼csdn_2002(vc小混混)回复于 2002-04-24 13:01:19 得分 0
楼上的,你也太热情了!这个恐怕不行啊!相关的我也都已经贴出来了!Top
19 楼yu_hl(卖柴火的小男孩)回复于 2002-04-24 13:17:47 得分 0
相关代码恐怕在你的dialog定义与实现里。Top
20 楼csdn_2002(vc小混混)回复于 2002-04-24 13:29:16 得分 0
真的就没别的办法了吗?!沮丧!啊!Top
21 楼csdn_2002(vc小混混)回复于 2002-04-24 13:43:49 得分 0
还请大家多帮忙啊!Top
22 楼wolf721()回复于 2002-04-24 14:28:40 得分 0
问题与无模式对话框的创建好象没有多大关系,估计是你为[按钮等控件添加变量]的这些控件中有比较特殊的控件,需要检查一下。Top
23 楼csdn_2002(vc小混混)回复于 2002-04-24 14:40:58 得分 0
可我的控件就一些按钮啊!
我添加变量也只是为了给按钮弄个图片啊!
真的不懂了!求教阿!Top
24 楼ukyoking(累)回复于 2002-04-24 14:54:53 得分 0
你可以看看assertion failed出现在哪个文件的哪一行,再判断哪出了问题,遇到问题要多动脑筋Top
25 楼csdn_2002(vc小混混)回复于 2002-04-24 15:05:48 得分 0
大哥!我是看了,可那不是我的文件,怎么知道阿!Top
26 楼ukyoking(累)回复于 2002-04-24 15:11:27 得分 0
老兄,你笨的可以,那个文件在vc的安装目录下有,assertion报错时会指出具体位置,你看它assert到那一句了,就是问题所在Top
27 楼chenzhou35(vcworm.51.net)回复于 2002-04-24 15:19:13 得分 5
检查你的
void CxxxDlg::DoDataExchange(CDataExchange* pDX)中是否有不存在或已经删除的变量,如果有,删除相应的DDX就行了。
========================
欢迎光临我的网站:
http://vcworm.51.net
Top
28 楼csdn_2002(vc小混混)回复于 2002-04-24 15:27:37 得分 0
谢谢楼上的,我看过了,没有!
2楼的,我真的很笨!麻烦你说清楚点!Top
29 楼chenzhou35(vcworm.51.net)回复于 2002-04-24 15:48:21 得分 0
出ASSERT的时候,选择重试,程序会停在出问题的语句上(当然,问题可能是别的地方引起的)。
阅读此段程序,看它是想检查什么(一般,系统使用ASSERT来提示一些非法的参数等等。)如果能看明白就能知道为什么出错了。如果看不明白,就把这段程序贴出来,大家看看。
========================
欢迎光临我的网站:
http://vcworm.51.net
Top
30 楼csdn_2002(vc小混混)回复于 2002-04-24 15:49:12 得分 0
还有什么意见啊!给我说说吧!Top
31 楼yu_hl(卖柴火的小男孩)回复于 2002-04-24 15:51:31 得分 0
在CShipinDlg构造函数, OnInitDialog里设断点。Top
32 楼csdn_2002(vc小混混)回复于 2002-04-24 15:53:22 得分 0
HWND CDataExchange::PrepareCtrl(int nIDC)
{
ASSERT(nIDC != 0);
ASSERT(nIDC != -1); // not allowed
HWND hWndCtrl;
m_pDlgWnd->GetDlgItem(nIDC, &hWndCtrl);
if (hWndCtrl == NULL)
{
TRACE1("Error: no data exchange control with ID 0x%04X.\n", nIDC);
ASSERT(FALSE);
AfxThrowNotSupportedException();
}
m_hWndLastControl = hWndCtrl;
m_bEditLastControl = FALSE; // not an edit item by default
ASSERT(hWndCtrl != NULL); // never return NULL handle
return hWndCtrl;
}Top
33 楼csdn_2002(vc小混混)回复于 2002-04-24 15:58:10 得分 0
BOOL CGdiObject::Attach(HGDIOBJ hObject)
{
ASSERT(m_hObject == NULL); // only attach once, detach on destroy
if (hObject == NULL)
return FALSE;
CHandleMap* pMap = afxMapHGDIOBJ(TRUE); // create map if not exist
ASSERT(pMap != NULL);
pMap->SetPermanent(m_hObject = hObject, this);
return TRUE;
}Top
34 楼chenzhou35(vcworm.51.net)回复于 2002-04-24 16:02:35 得分 0
应该是DDX的问题了,仔细检查你的
void CxxxDlg::DoDataExchange(CDataExchange* pDX)中是否有不存在或已经删除的变量,如果有,删除相应的DDX就行了。
如果没有,检查void CxxxDlg::DoDataExchange(CDataExchange* pDX)中是否有不存在的ID,或者有某个ID 的值为0 或 -1
========================
欢迎光临我的网站:
http://vcworm.51.net
Top
35 楼csdn_2002(vc小混混)回复于 2002-04-24 16:17:02 得分 0
楼上的,谢谢你!
我已经很仔细的检查过了,可还是没有啊!Top
36 楼csdn_2002(vc小混混)回复于 2002-04-24 19:00:40 得分 0
大家就没什么别的想法,可以教教我的嘛?Top
37 楼halcyon(让我们共同进步)回复于 2002-04-24 19:09:28 得分 0
upTop
38 楼itluck()回复于 2002-04-24 20:07:54 得分 0
问题应该在DDX,你好好查查变量之间的映射关系Top
39 楼csdn_2002(vc小混混)回复于 2002-04-24 20:08:07 得分 0
希望大家积极发言!我一直在线等待!请大家再帮帮我!谢谢了!Top
40 楼zzdaa(是否你还记得我?)回复于 2002-04-24 20:20:53 得分 0
检查一下你的对话框属性,是不是设置成child了,改成popup看一下Top




