ダイアログのDoModal()とEndDialog

[戻る]
ikuta 2007/10/29(月) 18:29:02
WindowsXP, 開発環境、VisualC++6.0 
ダイアログが例えば三つあり、相互間で行き来できるようになっています。 

AAADlg.cpp(リソース名IDD_AAADLG) 
BBBDlg.cpp(リソース名IDD_BBBDLG) 
CCCDlg.cpp(リソース名IDD_CCCDLG) 

CCCDlgクラスでAAADlgクラスへ行くように以下のように書きました。 

// Okボタン押下時、AAADlgへ行く 
BOOL CCCDlg::OnOK() 
{ 
    // AAADlgへ戻る為、モーダルダイアログボックスを起動 
    CAAADlg dlg; 
    dlg.DoModal(); 

    return TRUE; 
} 

CCCDlgでOKボタン押下でAAADlgへ行くのですが、AAADlgでBBBDlgへ行く処理をすると 
CCCDlgへ行ってしまいます。おそらくCCCDlgをDoModal()してEndDialog()で破棄して
いないのが原因と思われます。 
EndDialogなどで破棄する場所やその他の方法を教えてもらえると幸いです。 
よろしくお願いします。

PATIO 2007/10/30(火) 10:53:11
モーダルダイアログ間で行き来したいと言う話がどういう話なのかによるなぁと

AAAからBBBに行った場合に更にCCCへ行ったら、CCCでEndDialogした時に
どのダイアログへ行く動作が正しいのでしょう?
あと、モーダルダイアログで次のダイアログをまた呼びするような構造で
本当に良いの?と言うのも気になります。

AAA -> BBB -> CCC -> AAAとかとどんどん呼んで行くと繋がっていってしまいますけれど、
戻る時は読んだ順番に遡る方法で戻って良いのかとか、
この調子で呼んで行くととんでもなく階層が深くなった時にスタックオーバーフローしない
のか?とか問題が有りそうな気がします。

相互に移動すると言うがどういうイメージなのかをきちんと提示して
その上でモーダルダイアログが妥当なのかモードレスが妥当なのかと言う
検討も必要なのではないかと思います。

あと、AAADlgからBBBDlgを呼び出す処理が有りませんが、
その部分のコーディングはどうなっているのでしょう?

菟ー 2007/10/30(火) 23:41:51
>ダイアログが例えば三つあり、相互間で行き来できるようになっています。
すごい引っ掛かるこの一行。

AAADlg、BBBDlg、CCCDlgの3つがそれぞれを参照できる関係あるのかな?
それでいて
> BOOL CCCDlg::OnOK() 
> { 
>     // AAADlgへ戻る為、モーダルダイアログボックスを起動 
>     CAAADlg dlg; 
>     dlg.DoModal(); 
> 
>     return TRUE; 
> } 
こんな作り??????


恐ろしすぎる・・・・

まず問題の現象より、なにがしたいのか明確にしてください。
でないと、どこからアドバイスしたものやら・・・・・・。

2007/10/31(水) 00:51:58
AAAを表示する状態、BBBを表示する状態、CCCを表示する状態があり、同
時に複数表示する事は無く、それぞれをの状態で遷移させるという事でしょう
か。
もしそうならば、状態を管理する部分を別につくり、そこに各ダイアログの作成と表
示を書いたほうが良いと思います。

ikuta 2007/11/01(木) 20:07:16
PATIOさん、AAA⇒BBB⇒CCCの順番で進んで、BBB、CCCともにAAAに戻るようにしたいで
す。戻る処理は常にAAAに戻ります。進む処理は記述したとおり同じ方法で進みます。
前回のは消えてもいいのでモードレスダイアログの方がいいかもしれませんね。行き来
すると増えそうな気もしますし。

菟ーさん、やりたいことはAAAからBBBに進み、CCCには進まないA⇒B⇒Cとしか進みませ
んが戻りは常にAAAにもどるようにしたいです。

麩さん、別に作成した方がいいのでしょうか。未だにうまくすすみません。

菟ー 2007/11/01(木) 20:21:56
なら、
BBBからCCCを開いてるように見せかけて実は、
AAAからCCCを開いてる。ってロジックにしたら?

そうすると必ず、BBB、CCCどちらからもAAAに戻れます。


麩さんのも入れて、全てを取り仕切るクラスを1個作って
そこから3つのダイアログを表示してA⇒B⇒Cとしか進まない
ように見せかけて実は全てを取り仕切るクラスが順番に表示してるだけ。


てのはどうよ?

ITO 2007/11/02(金) 14:56:33
SDIじゃ駄目ですか?
僕はやったことないですが、SDIなら切り替えられるはずですよね。
いっそMDIにしたほうが楽だと思います。

たいちう 2007/11/02(金) 15:20:29
> SDIじゃ駄目ですか?
> 僕はやったことないですが、SDIなら切り替えられるはずですよね。
> いっそMDIにしたほうが楽だと思います。

SDIのCViewを複数作って切り替える方法ですか?
別に難しくはないけど、ダイアログの切り替えよりも簡単と言うわけではないですよ。
MDI案も含め、ダイアログのジャグリングで混乱している質問者には難しいでしょう。


仕様を考えてみた。


AAAはベース。常に表示されている。
AAAには、BBBを開くボタンとCCCを開くボタンがある。

BBBを開くボタンを押すと、BBBが開いて制御はBBBに移る。AAAは制御不可。
BBBには、閉じるボタンとCCCを開くボタンがある。
閉じるボタンを押すと、BBBが閉じてAAAに戻る。
CCCを開くボタンを押すと、BBBが閉じてCCCが開き、制御はCCCに移る。

CCCについては、BBBの逆。
BBBとCCCは何度でも互いを呼び出せるが、閉じるボタンを押すと
必ずAAAに戻る。


こんな仕様でどうでしょうか?
ikutaさんのやりたいこととどこが違いますか?

これならば、菟ーさんの、

> BBBからCCCを開いてるように見せかけて実は、
> AAAからCCCを開いてる。ってロジックにしたら?
> 
> そうすると必ず、BBB、CCCどちらからもAAAに戻れます。

が1番良いかと。

ikuta 2007/11/04(日) 16:54:07
[[解決]]
菟ーさん、たいちうさんありがとうございました。ロジックがわかったのでその方法で
がんばってみたいと思います。

SDIは調べてみてできそうならトライしてみてそれも今後に活かせればと思います。

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