メニューからダイアログ表示→閉じる→再表示のとき以下で落ちます。
何が悪いのかわかりません。至急教えて下さい。できればソースレベルで。
/*メニューからダイアログボックス表示 */
/*******************************************/
void CMainFrame::OnTyo01()
{
if (ChkDBOpen(this) == false){return;}
if(pTyo01->GetSafeHwnd()) ←ここで落ちる
{
if(::IsWindow(pTyo01->m_hWnd))
{
if(pTyo01->IsWindowVisible())
{
pTyo01->SetForegroundWindow();
//pTyo01->DestroyWindow();
return;
}
}
}
//生成
pTyo01 = new CSoc_Tyo01(this);
pTyo01->ShowWindow(SW_SHOW);
閉じるのときの処理↓
void CSoc_Tyo01::OnCancel()
{
// TODO: この位置に特別な後処理を追加してください。
//CDialog::OnCancel();
DestroyWindow();
}
void CSoc_Tyo01::PostNcDestroy()
{
// TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してくだ
さい
//CDialog::PostNcDestroy();
delete this;
}
> if(pTyo01->GetSafeHwnd()) ←ここで落ちる
このとき pTyo01には正当な値が設定されていますか?
正当な値だと思います。
ちなみに、このダイアログはMSFLEXGRIDで一覧表のようなものを表示しています。
どうもよくわからないんですが。
> void CMainFrame::OnTyo01()
> {
> if (ChkDBOpen(this) == false){return;}
> if(pTyo01->GetSafeHwnd()) ←ここで落ちる
ここで pTyo01 を使用してますよね?
> {
> if(::IsWindow(pTyo01->m_hWnd))
> {
> if(pTyo01->IsWindowVisible())
> {
> pTyo01->SetForegroundWindow();
> //pTyo01->DestroyWindow();
> return;
> }
> }
> }
> //生成
> pTyo01 = new CSoc_Tyo01(this);
でも、ここで new で得た値を設定してますよね?
> pTyo01->ShowWindow(SW_SHOW);
どう考えても不自然なのですが。
ダイアログをnewする条件がきちんと整理されていないような。
破棄したなら、pTyo01にはNULLを入れるなどして明示的にクリアさせた方がいいですよ。
ダイアログの表示/非表示と言ってますが、その動きを
SHOW/HIDEの制御で実現するのか、
生成&破棄で実現するのか、
方針を決めたほうがよさそうです。
NULLを入れることで解決しました。
それでも、これくらいは要るかも?
if(pTyo01 && pTyo01->GetSafeHwnd())
>それでも、これくらいは要るかも?
>if(pTyo01 && pTyo01->GetSafeHwnd())
無くても大丈夫。
MFCでGetSafe* 型のメンバ関数は、thisのNULLチェックがついています。
HWND CWnd::GetSafeHwnd() const
{ return this == NULL ? NULL : m_hWnd; }
おっ、そのようですね。
失礼しました。m(_ _)m