0

ネストされたダイアログで編集ボックスを設定しようとしていますが、実行時にプログラムがクラッシュします。2番目のダイアログに接続するために、次の変更を行いました。

1)タイプ2番目のクラス(CDialogから派生)の1番目のダイアログでメンバー変数を作成しました

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)2番目のクラスにCEdit変数を作成しました。これは、1番目のクラスからアクセスするために公開されています。4)ボタンのイベントハンドラー(最初のダイアログ)で、指定された編集ボックス(2番目のダイアログ)を読み取り専用にし、別のイベントハンドラーで読み取り専用プロパティを無効にします。エラーが発生するコードは次のとおりです。

  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のクラスに、編集モードを示す変数を追加します。コンストラクターで、初期化子を渡します。

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 に答える