VC6.0SP3/MFCです。
ダイアログA(以下A)を作りました。親ダイアログからボタンを押すことにより、
Aを表示しようとしています。Aは複数の構造体を受け取ってそのデータを表示
させたいので、コンストラクタでデータポインタを受けることにしました。
◎ボタンを押下した際の関数
void CMainDlg::OnBtnShowDlg()
{
A_DATA tAData; // 構造体
B_DATA tBData; // 構造体
int b = 1; // データ種別(1:AData, 2:BData)
CShowDisp *pDlg = new CShowDisp((LPVOID)&tAData, b);
pDlg->DoModal();
delete pDlg;
}
◎Aのコンストラクタ部分
CShowDisp::CShowDisp(CWnd* pParent /*=NULL*/)
: CDialog(CShowDisp::IDD, pParent)
{ // 標準のコンストラクタ(中略)}
CShowDisp::CShowDisp(LPVOID lpData, int nDataNo)
{ // 自作コンストラクタ
// 引数をメンバ変数にコピー
m_nShowDataNo = nDataNo; // データ番号
m_pShowDispData = lpData;// データポインタ
}
しかし、これを実行させると、DoModal()で異常終了します。
(dlgcore.cppのDoModal()に入った最初のASSERTでエラーです。)
知識としては、「コンストラクタは最初に呼ばれる部分」
「引数付きの独自のコンストラクタも作れる(オーバーロード?)」と
言うことぐらいしかわかりません。何がいけないのでしょうか?
単純に「CShowDisp *pDlg = new CShowDisp();」と宣言して
DoModal()を呼び出した場合難なく表示出来るのですが・・・。
初心者で申し訳ありませんがどなたか説明して頂けますか?
宜しくお願いします。
標準のコンストラクタは、CDialog(CShowDisp::IDD, pParent) として、
基底クラスのコンストラクタを呼び出していますが、
上記の自作コンストラクタは何も呼び出していません。
そのため、基底クラスは正しい初期化を行えず、途中でエラーになります。
お返事有難うございます。と、言うことは・・・
CShowDisp::CShowDisp(CWnd* pParent, LPVOID lpData, int nDataNo)
: CDialog(CShowDisp::IDD, pParent)
{
(略)
}
と、すれば良いのでしょうか・・・。早速やってみます。
↑の記述で出来ました。
ありがとうございました。