- - PR -
複数フォームを含むDLLでのMDI
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-08-23 15:47
はじめまして。
自社用のアプリで、機能別にプロジェクトを作成し、 それをクラスライブラリ(DLL)にしています。 環境は、VB.NET VS2005です。 機能別のクラスとはいえ、 似たような画面(form)がいくつもあるので、 ユーザーが混乱しないように、MDI形式にして、 メイン画面(MDI親)にて選択されたクラスだけの フォームの表示を行いたいのです。 下記の例ですと、 メイン画面(MDI親)でクラスAを選択すると、 クラスAだけのフォームがメイン画面(MDI親)の中で表示され、 他のクラスのフォームは閉じてしまいたいのです。 メイン画面(Mainprog.exe) | |---クラスA(APP-A.dll) | form-A1(クラスA初期画面) | |-- form-A1-1(クラスAサブ画面) | | |-- form-A1-1-1(クラスAサブ画面) | | | |-- form-A1-2(クラスAサブ画面) | | |---クラスB(APP-B.dll) クラスのフォームの呼び出しは、 下記コードでメイン画面(MDI親)にできました。 Dim frm As New APP-A.form-A1 frm.MdiParent = メイン画面 frm.Show() しかし、各クラスにはサブ画面がいくつもあり、 MDI親の中に呼出されたクラスの初期画面から クラスのサブ画面を呼出すと、 そのサブ画面はMDI親の外に表示されてしまいます。 サブ画面もMDI親の中に入れたいのですが、 どのような呼出しにすればいいのでしょうか? サブ画面の呼出しは、初期画面のボタンが押されたときに 下記のように呼出しています。 Private Sub Bt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bt.Click Dim f As Form f = New form-A-1-1 f.ShowDialog(Me) f.Dispose() End Sub MDI形式を使うのは初めてで、いろいろ検索してみましたが、 探しかたが悪いのか見つかりませんでした。 よろしくお願いします。 | ||||||||
|
投稿日時: 2006-08-23 17:08
まず思いつくのは、フォームの表示はサブ側でおこない、MDIChildrenへの追加部分のみを親へ通知して依頼することでしょうか。 以下は思うこと。 まず前提としてMDIは多段階層ではなく、1:Nであるということです。 #MDIなのでモーダルフォームは考慮していません。 これは親がすべての子を管理すること、子同士が関わらないことを意味しています。 これを守ることがベストですが、ご提示の設計になった気持ちもわかります。 気をつけなければならないのは、親が「子同士の関連を知らない」ことです。 たとえば一斉に閉じる場合の各子フォームのClosingイベントの順序などです。 #規則性があっても業務仕様がそれに依存してはいけないでしょう。 [ メッセージ編集済み 編集者: まどか 編集日時 2006-08-23 17:10 ] | ||||||||
|
投稿日時: 2006-08-24 13:16
長文でつたない文章にもかかわらず、 返答ありがとうございます。 機能別のアプリケーションとはいえ、 図面管理、プロジェクト管理、受注管理など 同時に起動することもあり、 そうすると、ディスプレイがフォームだらけになります。 また似たようなフォームがあってまぎわらしいので、 MDIですっきり整理したいなと思ったのですけど、 私のMDIに対する認識が間違っていたようです。 まどかさんの方法を試してみたいと思いますが、 同時に設計自体の見直しも考えて見なければなりませんね。 OUTLOOK風に左側の選択ボタンにて、 右側のアプリが切替わるようなものが作れればと思っているのですが・・・。 調べてみます。 | ||||||||
|
投稿日時: 2006-08-24 14:33
MDIはそれを採用した時点でアプリケーションそのものの性質を決定付けてしまいますので、 業務仕様(操作性やトランザクションなど)から考えてMDIが適切かどうかという順序で考えないと 後々身動きが取れなくなってしまいます。 特にトランザクションが絡んだ処理など業務の整合性を保つことがちゃんと表現できるかどうかという点を再考するとよいでしょう。
MDIでクライアント領域にToolStripを配置してタスクバーのようにサブ機能を切り替えるとか。 #サブ機能クラスが自身のウィンドウの一覧を管理して表示/非表示メソッドを実装する #親はサブ機能クラスへ依頼するだけ。 |
1