Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2047236
  • 博文数量: 454
  • 博客积分: 10921
  • 博客等级: 上将
  • 技术积分: 5396
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-15 15:20
个人简介

伪IT男

文章分类

全部博文(454)

文章存档

2016年(2)

2013年(6)

2012年(17)

2011年(29)

2010年(24)

2009年(54)

2008年(53)

2007年(202)

2006年(67)

分类:

2007-01-24 14:24:10

自己写了个对话框,往上添加动态控件,在变量关联的时候出了问题。一执行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这个函数出错了,也就是变量和空间之间的对应关系有问题!

阅读(5985) | 评论(0) | 转发(0) |
0

上一篇:google的新功能

下一篇:几个谜语

给主人留下些什么吧!~~