自己写了个对话框,往上添加动态控件,在变量关联的时候出了问题。一执行UpdateData(FALSE),就出错:
Debug Assertion Failed!
OutPut出现大量
First-chance exception in dlg.exe (HOOKDLL.DLL): 0xC0000005: Access Violation.
显示相关文件为
c:\program files\microsoft visual studio\vc98\mfc\src\dlgdata.cpp
line 43
。
仔细看了一下这个line 43,
具体出错位置如下:
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);//**************此处出错 line 43
AfxThrowNotSupportedException();
}
m_hWndLastControl = hWndCtrl;
m_bEditLastControl = FALSE; // not an edit item by default
ASSERT(hWndCtrl != NULL); // never return NULL handle
return hWndCtrl;
}
然后查了一下GetDlgItem函数,意思是:This method retrieves a pointer to the specified control or child window in a dialog box or other window. The pointer returned is usually cast to the type of control identified by nID.
估计这个错误信息的意思是没有找到这个相应控件类型,有几种原因,一是控件ID不存在,二是控件未创建,三是控件的类型不对。我发现自己出的问题是第三种,就是我创建了一排按钮,指定的ID错误指向了一个ComboBox,而我却要给他DDX_Text(pDX, IDC_EDIT_AUTOFILL, m_edit);当然就会出错。
解决这个问题的时候,参考了如下文章
并将部分内容摘抄如下
问题:
1.在一个对话框类CDlgDlg初始化时动态建立一个Edit控件,在Resource.h中定义一个ID如下:
#define IDC_BUTTON1 1002
2.
在话框类CDlgDlg定义公有变量
public:
CEdit *m_pEdit;
3.对话框初始化时建立控件
BOOL CDlgDlg::OnInitDialog()
{
//...
m_pEdit = new CEdit;//added by likfeng
m_pEdit->Create(ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER,
CRect(10,10,100,30), this, IDC_EDIT_AUTOFILL);//added by likfeng
//...
}
4.此时程序运行没问题,在OnButton1()中如下代码也没有问题
void CDlgDlg::OnButton1()
{
m_pEdit->SetWindowText("asfASFAS");//added by likfeng
}
5.但是要想和普通控件那样建立变量关联如下:
class CDlgDlg : public CDialog
{
// Construction
public:
CDlgDlg(CWnd* pParent = NULL); // standard constructor
CEdit *m_pEdit;
// Dialog Data
//{{AFX_DATA(CDlgDlg)
enum { IDD = IDD_DLG_DIALOG };
double m_edit;//added by likfeng/////////////////////////
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CDlgDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CDlgDlg)
virtual BOOL OnInitDialog();
//......
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
void CDlgDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgDlg)
DDX_Text(pDX, IDC_EDIT_AUTOFILL, m_edit);//added by likfeng
//}}AFX_DATA_MAP
}
CDlgDlg::CDlgDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDlgDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlgDlg)
m_edit = 0.0;//added by likfeng
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
6.出现如下Debug错误
Debug Assertion Failed!
OutPut出现大量
First-chance exception in dlg.exe (HOOKDLL.DLL): 0xC0000005: Access Violation.
显示相关文件为
c:\program files\microsoft visual studio\vc98\mfc\src\dlgdata.cpp
具体出错位置如下:
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;
}
...
请问各位大侠
是不是动态建立的控件不能建立变量关联
如果能的话怎样做
不能的话有什么替代方法比较方便的读取和更改Edit的值(double类型)
43
DDX_Text(pDX, IDC_EDIT_AUTOFILL, m_edit);//added by likfeng
会在Edit建立之前先更新一下他的显示,但是那个时候这个控件还不存在,所以出现了异常
为了解决这个问题,可以把他的create放在dialog的OnCreate中调用。也就是对话框生成之后立即生成Edit控件,
int CDlgDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
m_pEdit = new CEdit;//added by likfeng
m_pEdit->Create(ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER,
CRect(10,10,100,30), this, IDC_EDIT_AUTOFILL);//added by likfeng
return 0;
}
一个CDialog初始化时的异常问题 |
[ 来源:ITWENKU 时间:2006-10-23 10:09:38 | 浏览:2人次 ] |
|
在MFC初始化CDialog::OnInitDialog()时,Debug Assertion Failed. File:dlgdata.cpp Line:44 TRACE(traceAppMsg, 0, "Error: no data exchange control with ID 0x%04X.\n", nIDC); 不知道是什么道理,望指教. 谢谢.
Error: no data exchange control with ID 0x%04X.\n", nIDC与nIDC的控件无法交换数据造成的不成初始化问题.你是怎么设计这个对话框的?
是不是你把控件删除了而变量删除了! 找找看
依我的经验,是控件删除了,而为控件映射的变量没有删除
绝对是控件删除了,但变量还是存在的。 建议到头文件中删除于控件相关的信息,在源文件消息的MAP表中删除ID对应的函数,DoDataExchange删除控件对应的控件实例
DoDataExchange这个函数出错了,也就是变量和空间之间的对应关系有问题!
|
阅读(6079) | 评论(0) | 转发(0) |