0

我试图在嵌套对话框中设置一个编辑框,但程序在运行时崩溃。我进行了以下更改以与第二个对话框建立联系:

1)在第二类类型的第一个对话框中创建成员变量(派生自CDialog)

2) 在 1s 类的 OnInitDialog() 中,我有:

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() 方法时,程序崩溃了。错误是:调试断言失败!第 492 行的 dlgcore.cpp 请帮助,我正在为此苦苦挣扎一段时间,在网上搜索,但找不到原因。我没有包含整个代码,因为我认为它会太多,但是如果您希望我添加您认为我错过的功能,请告诉我,我会将其添加到线程中。我正在使用 MSVC2008

4

1 回答 1

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();

这使您不会过多地了解对话框如何实现“只读”。

希望这对您有所帮助。

于 2012-04-07T16:49:40.807 回答