Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 软件时空 > 软件相关 > vc 动态控件的变量关联
【标  题】:vc 动态控件的变量关联
【关键字】:vc
【来  源】:http://www.cublog.cn/u/20725/showart.php?id=237172

vc 动态控件的变量关联

Your Ad Here
自己写了个对话框,往上添加动态控件,在变量关联的时候出了问题。一执行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);当然就会出错。
 
解决这个问题的时候,参考了如下文章
http://topic.csdn.net/t/20041019/08/3468482.html
http://www.itwenku.com/program/1/41875.htm
并将部分内容摘抄如下
问题:  
  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这个函数出错了,也就是变量和空间之间的对应关系有问题!

转载:回车和换行:【上一篇】
状态图建模方法:【下一篇】
【相关文章】
  • MSVC .NET Setup Guide
  • 对Windows 2000中wkssvc.dll中某个函数的分析
  • VC中IDE的一些使用小技巧
  • 简单的VC 操作XML 文件的的方法
  • 在VC++中实现CRC32算法。
  • VC调试技巧收集整理
  • vc使用技巧(不断更新中)
  • VC如何实现语法自动提示功能?
  • VC 中进程与多进程管理的方法
  • 简单建立VC + DDK的驱动开发环境
  • 【随机文章】
  • [c#泛型学习笔记之二]泛型的性能
  • 一句话Linux(备查)
  • 使用 Microsoft.NET Frameworks 创建基于 Windows 的应用程序
  • 数据库和数据仓库的区别
  • Linux内核的同步机制
  • 辽宁货架,吉林货架,黑龙江货架,哈尔滨货架
  • 修改OSPF 管辖距离
  • 各种家庭自动化协议的介绍与比较
  • 数时跳转到动画开始?并开始播放
  • SQL语句优化方法30例
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.