DoModalについて質問があります。
なにも実装せず
単にCDialog temp; temp.DoModalとし、
DoModalが−1を返した場合、システムエラーメッセージが表示されるのでしょうか?
それとも単に−1を返して、呼び出し側に制御が戻るのでしょうか?
やってみれば?
> やってみれば?
結果報告をよろしくお願いします
なんでも掲示板 1.0.1.5
http://kerochan.no-ip.com/vcsdk/bbs/view.php?id=3826
どうやってDoModalがダイアログの作成に失敗してー1を
返すという状況を作ることができるのですか?
> どうやってDoModalがダイアログの作成に失敗してー1を
> 返すという状況を作ることができるのですか?
最初に書かれている通り、
CDialog temp;
temp.DoModal();
とするだけですが…
戻り値受け取る為に
CDialog temp;
int i;
i = temp.DoModal();
とかするかも知れませんが。
てきと〜にダイアログベースなMFCプロジェクト作って、
ボタン追加してそのボタンのハンドラに記述してみた。
結果は…自分で試して下さい。
VC++に関する質問・回答BBS
http://www.net24.ne.jp/~kenji/bbs/wforum.cgi?mode=allread&no=942&page=0
すいません、説明が足りませんでした。
私が検証したいのはー1が返ってくる状況です。
単にint i = dlg.DoModal()とすればdlgの中で実装
してあるEndDialogの返り値のIDOKやID何とかが返って
くると思います。私が知りたいのは自分で-1を返す
実装をしない限り-1は返ってこないのか、それとも
何かシステムに問題が起こり、デフォルト実装で-1を
返すケースがあるのか、そしてそのときアプリケーション
に制御が正常に戻ってくるのかを知りたいのです。
> 私が知りたいのは自分で-1を返す実装をしない限り-1は返ってこないのか、
> それとも何かシステムに問題が起こり、デフォルト実装で-1を返すケースがあるのか、
> そしてそのときアプリケーションに制御が正常に戻ってくるのかを知りたいのです。
MFCのソースを確認した方がよろしいかと思いますが。
CDialog::DoModal()
はC:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC\DLGCORE.CPP内にあります。(VC++6の場合)
軽く目を通した限りでは…
・ダイアログリソースが取れない時
・ダイアログ作成時に例外が発生した時(作成に関してイロイロ処理しているようですが)
に-1が返るようです。
最初のCDialog temp; temp.DoModal();をReleaseビルドで実行してもアプリ自体が落ちないようなので、
「試した範囲では」制御が戻ってきていると考えてよろしいかと。
# ナニもしていないに等しいので「試した範囲では」はほとんどアテにならんでしょうけど。
# MFC使いではないのでコレ以上は不明です。
ありがとうございます。後はソースを追って自分で検証します。
画面に貼り付けた OCX が実行環境下に無かった場合か何かで
(すみません、はっきり覚えていない…)
DoModal() が -1 を返したことがありました。
当然のことながら、デバッグ環境下では起こすことはできません。
このときは、モジュールが大きかったせいか、メモリが不足気味だったせいか、
システムエラーは発生しませんでした。
> そういうパターン画面に貼り付けた OCX が実行環境下に無かった場合か何かで
> (すみません、はっきり覚えていない…)
> DoModal() が -1 を返したことがありました。
そういうパターンですと…
InitCommonControlsEx()が必要なコントロールが貼り付けてあるダイアログで、
InitCommonControlsEx()を実行していなかった場合。
というのもありますかね?
# SDKで1時間近く悩んだことがある(^_^;)
// return -1 in case of failure to load the dialog template resource
if (lpDialogTemplate == NULL)
return -1;
CATCH_ALL(e)
{
DELETE_EXCEPTION(e);
m_nModalResult = -1;
}
瀬戸っぷさんの言うとおりでした。もしかしたらシステムエラー
が起こるケースも他にあるかもしれませんが、とりあえず−1が
帰ってきた場合にエラーメッセージを出すか出さないかで悩んで
いたので、ソースを見る限りはエラーメッセージを出したほうが
いいという結論を得ました。 皆さんご協力ありがとうございました。
解決…ですか?
他は放置ですか??
ツイート | ![]() |