ダイアログ再表示で落ちる – プログラミング – Home

ダイアログ再表示で落ちる
 
通知
すべてクリア

[解決済] ダイアログ再表示で落ちる


はなちゃん
 はなちゃん
(@はなちゃん)
ゲスト
結合: 22年前
投稿: 7
Topic starter  

メニューからダイアログ表示→閉じる→再表示のとき以下で落ちます。
何が悪いのかわかりません。至急教えて下さい。できればソースレベルで。

/*メニューからダイアログボックス表示 */
/*******************************************/
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;
}


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

> if(pTyo01->GetSafeHwnd())   ←ここで落ちる

このとき pTyo01には正当な値が設定されていますか?


返信引用
はなちゃん
 はなちゃん
(@はなちゃん)
ゲスト
結合: 22年前
投稿: 7
Topic starter  

正当な値だと思います。
ちなみに、このダイアログはMSFLEXGRIDで一覧表のようなものを表示しています。


返信引用
ん
 ん
(@ん)
ゲスト
結合: 24年前
投稿: 106
 

どうもよくわからないんですが。

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

どう考えても不自然なのですが。


返信引用
sugar
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

ダイアログをnewする条件がきちんと整理されていないような。
破棄したなら、pTyo01にはNULLを入れるなどして明示的にクリアさせた方がいいですよ。

ダイアログの表示/非表示と言ってますが、その動きを
SHOW/HIDEの制御で実現するのか、
生成&破棄で実現するのか、
方針を決めたほうがよさそうです。


返信引用
はなちゃん
 はなちゃん
(@はなちゃん)
ゲスト
結合: 22年前
投稿: 7
Topic starter  

NULLを入れることで解決しました。


返信引用
NEG(ねぐ)
 NEG(ねぐ)
(@NEG(ねぐ))
ゲスト
結合: 23年前
投稿: 178
 

 それでも、これくらいは要るかも?
if(pTyo01 && pTyo01->GetSafeHwnd())


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

>それでも、これくらいは要るかも?
>if(pTyo01 && pTyo01->GetSafeHwnd())

無くても大丈夫。
MFCでGetSafe* 型のメンバ関数は、thisのNULLチェックがついています。

HWND CWnd::GetSafeHwnd() const
{ return this == NULL ? NULL : m_hWnd; }


返信引用
NEG(ねぐ)
 NEG(ねぐ)
(@NEG(ねぐ))
ゲスト
結合: 23年前
投稿: 178
 

 おっ、そのようですね。
 失礼しました。m(_ _)m


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました