検索・置換ダイアログ [プログラミング]
CFindReplaceDialog
という文字列の検索用と置換用のダイアログがありました。
在るのはいいけど、使い方が解らない。
そこで、VisualC++ に付属しているMFCのソースファイルの中からCFindReplaceDialog
を使っているところを探してみると、CEditView
が使っているのを発見。
実際の使い方はCEditView
のソース(VIEWEDIT.CPP)から判明したんですが、なにやら引っかかる記述が…。
(VIEWEDIT.CPPから抜粋) pEditState->pFindReplaceDlg = new CFindReplaceDialog; if (!pEditState->pFindReplaceDlg->Create(bFindOnly, strFind, strReplace, dwFlags, this)) { pEditState->pFindReplaceDlg = NULL; return; }
new
しているのにdelete
していない。
この箇所だけに限らず、new
したCFindReplaceDialog
をdelete
しているところが無い。
うっかりミスにしてはシャレにならないので、よく調べてみると………。
(DLGFR.CPPから抜粋) void CFindReplaceDialog::PostNcDestroy() { delete this; }
WM_NCDESTROY
メッセージを受け取った後(要はウィンドウを閉じた時)の処理で自分自身をdelete
しています。
と言う事は、CFindReplaceDialog
を使う場合は
- 必ず
new CFindReplaceDialog
として構築する。 delete
は実行してはいけない。
となるわけですが、ヘルプには、そんな事は一言も書いてなくて、
このダイアログ ボックスはモードレス ダイアログ ボックスなので、オブジェクトはスタック上ではなく、new 演算子を使ってヒープ領域に確保されます。
この様に、モードレスダイアログとして使うためにnew
しなければいけないみたいな書き方、と言うか、このダイアログを作ると勝手にnew
されるみたいな書き方がしてあるのはなぁ…。
今日の三冊 | |
西の善き魔女外伝〈1〉金の糸紡げば (C・NOVELSファンタジア)
|
タグ:VisualC++
2005-09-24 08:09
nice!(0)
コメント(0)
トラックバック(0)
コメント 0