2012-04-07 61 views
0

我试图在嵌套对话框中设置编辑框,但程序在运行时崩溃。我已经作出了如下因素的变化,以与第二对话连接:MFC控制嵌套对话框中的编辑框获取断言错误

1)类型的第一对话框中的OnInitDialog制成的成员变量的第二类(从CDialog派生)

2)()的在1秒的I类有:

CRect rcDlg; 
m_dDlgData.Create(CDialogData::IDD, this); // Create the second dialog 
GetWindowRect(rcDlg); 
m_dDlgData.SetWindowPos(NULL, 0, 0, rcDlg.Width(), rcDlg.Height(), SWP_NOZORDER); 

3)在所述第二类,它是公共为了从第一类访问它创建一个CEdit变量。 4)在按钮的事件处理程序中(在第一个对话框中),我想让给定的编辑框(在第二个对话框中)为只读,并在另一个事件处理程序中禁用只读属性。下面是代码,其中所述错误发生的情况:

void CZad1SemovDlg::OnBedit() 
    { 
    m_dDlgData.EGNReadOnly(true);//no problems here 

    ///some code/// 

    if(m_dDlgData.DoModal() == IDOK)// <-- the error happens here 
    { 
    //more code 
    } 
    } 

    bool CDialogData::EGNReadOnly(bool check) 
    { 
    m_cEGN.SetReadOnly(check);//here nothing strange happens, the variable is 
           //initialised 
    return true; 
    } 

奇怪,控制和对话变量被初始化,但是当我运行的DoModal()的方法,所述程序崩溃。错误是:调试断言失败! dlgcore.cpp在线492 请帮忙,我现在正在为此苦苦挣扎,搜索了网络,但找不到原因。我没有包含整个代码,因为我认为它太多了,但如果你想让我添加一个你认为我错过了的函数,告诉我,我会将它添加到线程中。我正在使用MSVC2008

回答

0

当您调用.DoModal()时,它会尝试通过调用m_dDlgData.Create()再次创建已创建的对话框。断言告诉你该对话已经创建。而不是调用DoModal(),调用m_dDlgData.ShowWindow(SW_SHOW),它应该工作。但是,ShowWindow()会显示无模式的对话框,但它应该给你你想要的。

编辑:为了达到您的目标,在DlgData类中添加一个var来指示编辑模式。在构造函数中,传递一个初始化:

class CDlgData 
{ 
    CDlgData(BOOL bEditMode); 
    private BOOL m_bEditMode; 
} 

CDlgData::CDlgData(BOOL bEditMode) 
{ 
    m_bEditMode = bEditMode; 
} 

CDlgData::OnInitDialog(...) 
{ 
    ... 
    if(m_bEditMode) 
    { 
    // Set the controls to whatever 
    m_cEGN.SetReadOnly(TRUE); 
    } 
} 

当你需要显示它,只是把它:

CDataDlg dlg(TRUE); // for editing or FALSE for add 
dlg.DoModal(); 

这阻止你太多了解的对话框如何实现“只读”。

希望这可以帮助你。

+0

没有这样的函数“Show()”,我想你的意思是ShowWindow()。你知道如何初始化第二课的CEdit控件吗?因为如果我不用Create()手动创建对话框,因此不会调用OnInitDialog(),因此不会初始化m_cEGN。 – Goshutu 2012-04-07 17:47:12

+0

ShowWindow()是正确的。 Create()完成一切,包括调用OnInitDialog。为什么你将它作为OnBedit()上的Modal窗口显示? – 2012-04-07 19:40:15

+0

我的意图是有两个按钮 - 新建和编辑,它们打开相同的对话框,但使用编辑打开时,编辑框m_cEGN将是只读的。最后,特别是在制作过程中的一个想法,所以我认为编辑代码会更容易,而不是重写它。并设置事件处理程序的字段(在本例中为OnBedit())。您是否知道使用DoModal创建将参数传递到创建的窗口的方法? – Goshutu 2012-04-07 20:16:56