是不是动态建立的控件不能建立变量关联,内详细,在线...
问题:
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类型)
问题点数:66、回复次数:7Top
1 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2004-10-19 09:01:55 得分 16
当然可以。你就当DoDataExchange为普通函数。Top
2 楼likunfeng(likfeng)回复于 2004-10-19 09:02:44 得分 0
对于从控件面板上拖到对话框上的控件,可以手工建立其变量关联
为什么动态建立的控件就出错呢?
期盼回复Top
3 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2004-10-19 09:03:13 得分 6
DDX_Text(pDX, IDC_EDIT_AUTOFILL, m_edit);//added by likfeng
=>
if(m_pEdit)
DDX_Text(pDX, IDC_EDIT_AUTOFILL, m_edit);//added by likfengTop
4 楼likunfeng(likfeng)回复于 2004-10-19 09:27:50 得分 0
to:DentistryDoctor(雅克医生(潜心修内功))
新建了一个对话框程序试了试
改了也出错
只要加上
if(m_pEdit)
DDX_Text(pDX, IDC_EDIT_AUTOFILL, m_edit_autofill);//added by likfeng
就会
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;
}
是否和 ASSERT(FALSE);//**************此处出错 有关
莫非此文件损坏?
还是我遗漏了什么地方Top
5 楼kevin_wang(砸锅卖铁)回复于 2004-10-19 09:32:24 得分 36
问题是这样的:
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;
}
Top
6 楼kevin_wang(砸锅卖铁)回复于 2004-10-19 09:33:02 得分 8
请赶快揭帖!Top
7 楼likunfeng(likfeng)回复于 2004-10-19 09:42:14 得分 0
kevin_wang(砸锅卖铁)说到问题症结所在,多谢
也十分感谢DentistryDoctor(雅克医生(潜心修内功))
结贴拉Top





