アプリ終了について

[戻る]
GG 2007/02/15(木) 08:58:24
いつもお世話になっています、GGです。

アプリ終了についてお伺いいたします。
終了は2通りがあります、
1.メニューの「ファイル」→「アプリケーションの終了」にあります、
2.ウィンドウの右上×にあります。

目的というのは、終了直前にデータを保存します。

問題1:上記の1に、
void C***Doc::OnAppExit()
{
    if (pPolyStructPart){    
      ・・・    // 上書き保存、
     return;
    }
    AfxGetMainWnd()->PostMessage(WM_COMMAND, ID_APP_EXIT);
}
結果は終了できません(アプリがOnAppExit()を繰り返し呼び出しています)

問題2:上記の2に、
終了の流れがわかりません、
保存用の関数(if (pPolyStructPart){…})はどこに置けばいいでしょうか、


以上、よろしくお願いします。
環境:.Net(2002) MFC使用、Win2000

GG 2007/02/15(木) 09:01:21
修正
    if (pPolyStructPart){    
      ・・・    // 上書き保存、
     return;
    }
    AfxGetMainWnd()->PostMessage(WM_COMMAND, ID_APP_EXIT);
の
return;は
//return;
です。
   if (pPolyStructPart){    
      ・・・    // 上書き保存、
     //return;
    }
    AfxGetMainWnd()->PostMessage(WM_COMMAND, ID_APP_EXIT);

よろしくお願いします。

tetrapod 2007/02/15(木) 09:39:29
なぜに非推奨とされてる C**App::OnAppExit で処理をするのかな?
MSDN 読んだ?
http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/vclib/html/_MFCNOTES_TN022.asp

> AfxGetMainWnd()->PostMessage(WM_COMMAND, ID_APP_EXIT);
OnAppExit 中で、再度 AppExit を呼ぶよう指示してるから当然の動きだよ
どうせ書くなら CWinApp::OnAppExit(); のほうがいい。
でも Microsoft 非推奨な使い方なので MSDN に従って修正するべきだね。

GG 2007/02/15(木) 13:18:01
tetrapod さん、
ご返事ありがとう。

問題1が解決しました。
void C***Doc::OnAppExit()
{
 ...
 AfxGetMainWnd()->PostMessage(WM_CLOSE);
}

よろしくお願いします。

ぬふや 2007/02/15(木) 14:04:14
ドキュメントクラスのデストラクタで保存処理するのは反則でしたっけ。

GG 2007/02/15(木) 14:22:41
[[解決]]
問題2も解決しました。
保存用関数は
OnDestroy()に置けばOKです。

ありがとうございました。

tetrapod 2007/02/15(木) 14:39:00
Doc-View を使っているともいないとも書いていないし、
そもそも俺のコメント正しく読んでないとしか思えないんだけど。

まあ案件がはっきりしないのでなんともいいがたい。

「Doc-View を使っていて C**Doc を保存したい」のであれば
そもそも AppExit で処理すること自体が Doc-View を理解していない証拠。
普通には Serialize を実装していれば勝手にやってくれるわけだし。
MSDN の言葉をそのまま借りれば Doc がデーターベースそのものであるなら
データベースを閉じるには OnCloseDocument を使うべき。

何をいつ何の目的で保存するのかで解決策は違う。

「アプリケーションの終了」という文言にとらわれすぎてると道を見誤るよ。
Doc-View を正しく使っていれば、アプリケーションの終了処理の一環として
先に Doc の保存が走るから「終了ハンドラ」で保存する必要は一切無い。

GG 2007/02/15(木) 15:43:03
tetrapodさん、
ご返事ありがとう.

>何をいつ何の目的で保存するのかで解決策は違う。
説明が足りないです、すみませんでした。

>データベースを閉じるには OnCloseDocument を使うべき。
OnCloseDocument()を使いました。

ご指導ありがとうございました。

古いスレッドには追加発言できません。