現在、通信系のプログラミングにて開発を行っているのですが
VC++6.0にて質問があり、投稿させて頂いております。
概念的なものがお聞きしたいのですがよろしくお願いいたします。
MFCにて開発してます。
まず親ウィンドウがあります。(メイン)
サブウィンドウ(CDialogからの派生クラス)が7画面あります。
それぞれのサブウィンドウクラスのクラスポインタを
親ウィンドウクラスがメンバで持っており親クラスのコンストラクタで
オブジェクトを生成しています。
ここまでは問題なくいけています。
※各サブウィンドウクラスは全てモーダルです。
画面ごとに通信するメッセージ(送信/受信メッセージ)は別です。
ここからが質問になるのですが
サブウィンドウを開いた状態で(モーダル)他の
サブ画面がメッセージを受けると現在開いている
サブウィンドウがフォーカスを持っているので
エラーになりアプリが終了してしまいます。
以下に簡単にソースを記述します
<親ウィンドウクラス.h>
//メンバ
サブウィンドウ1* m_pcsサブウィンドウ1
サブウィンドウ2* m_pcsサブウィンドウ2
サブウィンドウ3* m_pcsサブウィンドウ3
サブウィンドウ4* m_pcsサブウィンドウ4
サブウィンドウ5* m_pcsサブウィンドウ5
サブウィンドウ6* m_pcsサブウィンドウ6
サブウィンドウ7* m_pcsサブウィンドウ7
<親ウィンドウクラス.cpp>
//コンストラクタ
m_pcsサブウィンドウ1 = new サブウィンドウ1();
m_pcsサブウィンドウ2 = new サブウィンドウ2();
m_pcsサブウィンドウ3 = new サブウィンドウ3();
m_pcsサブウィンドウ4 = new サブウィンドウ4();
m_pcsサブウィンドウ5 = new サブウィンドウ5();
m_pcsサブウィンドウ6 = new サブウィンドウ6();
m_pcsサブウィンドウ7 = new サブウィンドウ7();
// ポップアップメニュ選択メソッド
m_pcsサブウィンドウ1なら…
m_pcsサブウィンドウ1->DoModal();
m_pcsサブウィンドウ2なら…
m_pcsサブウィンドウ2->DoModal();
m_pcsサブウィンドウ3なら…
m_pcsサブウィンドウ3->DoModal();
・
・
・
※ これでモーダル制御は出来ているのですが上記にも
質問したとおり現在、開いているウィンドウ以外が
メッセージを受け取ると例外が発生して
終了します。わかりにくいかもしれませんが
本当に困っています。よろしくお願いいたします。
なおモーダル終了には各サブ画面の特定のボタンが
押下されたときに this->EndDialog();
にて終了しています。
よろしくお願いいたします。
# 「概念的なもの」というのはちょっと漠然としてよくわかりませんが。
別のダイアログが開いているときは他の受信は無視が期待動作なら、
それで落ちちゃうのはただのバグです。(多分、何か考慮もれててガードが抜けてる)
他のダイアログが出てても受信して、内部処理は並行処理というのが期待動作でも、
結局は同種のバグです。
他の受信をしたらダイアログを切り替えて…等が期待動作の場合には、
モーダルでいいのか?なども含めて考える必要がでるかもしれませんが、
いずれにせよ、堅牢なアプリは「予期せぬ受信」に耐えられるように書く必要が
ありますので、落ちてしまうようなら、それはバグといいます。
読む限り、ソースの問題(書いたようは動いているが、意図したようには書けていない)
の可能性が高そうに思いますので、ソースを見てデバッグするのが近道かと。
まず、アプリが落ちたところが特定できているのか。
デバッグ版で再現するなら落ちる場所も理由もわかると思いますので、
その情報と、関連ソースなどないと、ものを見てない人にはあまり
助言のしようもないように思います。
お返事ありがとうございます。
明日に開発現場に行ってからまた
ご返答いたしたいと思います。
セキュリティ上の関係で持ち出し出来ないので
詳細な情報をお伝えできなくて申し訳ございませんm(--)m
独自FWにて開発している上にDLLなども独自で
作成しているものが多く正確な情報をお伝えできないかも
しれませんがよろしくお願いいたします。
また後日報告いたしますので失礼いたします。
ありがとうございました!!(^^)
とりあえず暫定というかこれでやってみました。
サブウィンドウ->DoModal();
だと毎回OnInitDialogが呼ばれるので
サブウィンドウクラスにフラグをメンバで持たせて
OnInitDialogでメンバのフラグを立てる。
フラグの立っている場合のみメッセージを受信する。
それ以外は捨てるってのでとりあえずガードはいれました。
他にやりかたあればご教授願いたいくらいなのですが…
とりあえずはこれで問題なく動作しています。
そもそもハンドルがない状態なのでウィンドウが開かれているか
どうかの判断も出来ないためにDoModalメソッドは若干使用しにくい
イメージがあります。(--;)
私の使い方が悪いのでしょうか??
Modalを使用する=他の画面を操作する必要はない
つまり、親がDialogのポインタを持ってどうこうするのではなくて
XXXDialogのインスタンスをメニューが選択された時点で生成、
DialogのOK/Cancelが押されたで終了処理をすればいい。
これならハンドルがないとかそういうことは起こらないと思われる
メッセージにこだわりすぎてないかな?
ウインドウ指定とメッセ-ジの二つの要素をもったグローバルな
変数を作成する。
サブウインドウはタイマールーチンでメッセージをポ-リングする。
ではだめですか?
今までの経過をみているといたちごっこでは?
このままだと、ダイアログの移動とか拡大縮小等も監視しないと
いけなくなるのでは?