DOBON.NET DOBON.NETプログラミング掲示板過去ログ

子フォームのリストを表示するには?

環境/言語:[Windows2000 VB.NET]
分類:[.NET]

いつもお世話になっております。

タイトルの通り、子フォームのリストについて質問なのですが、どぼん!さんの .NET Tips
( http://dobon.net/vb/dotnet/form/mdiapplication.html の一番下) にある子フォームの
リストメニューと同じものを画面内の右クリックでコンテキストメニューのようにどこでも表示したい
と思っているのですが可能でしょうか?

方法が分かる方がいらっしゃいましたら、ご教授下さい。
よろしくお願い致します。
■No6342に返信(もりもりさんの記事)
> リストメニューと同じものを画面内の右クリックでコンテキストメニューのように
> どこでも表示したいと思っているのですが可能でしょうか?
> 方法が分かる方がいらっしゃいましたら、ご教授下さい。
> よろしくお願い致します。

それって↓こういうことでしょうか?
うぷされたファイルを解凍して実行してください。
(この記事にはファイル"NullpoSample01.zip"が添付されていましたが、削除されました。)
java.lang.Nullpoさん、ご回答ありがとうございます。

まさに添付されたものと同様の事をしたいと思っています。
誠に申し訳ありませんが、ソース等がありましたらご教授下さい。

よろしくお願い致します。
こんにちは、もりもりさん。

■No6383に返信(もりもりさんの記事)
> まさに添付されたものと同様の事をしたいと思っています。
> 誠に申し訳ありませんが、ソース等がありましたらご教授下さい。
> よろしくお願い致します。

今回、コンテキストメニューの直下に属すようにするため、
MenuItem.MdiList = True によるリスト表示ができない仕様ですよね?
ということは、ほぼ手作りになるのは、お判りになられますでしょうか?


> 誠に申し訳ありませんが、ソース等がありましたらご教授下さい。

と言いたくなる気持ちは判るのですが、
手作りとなると、色んな方法があるかと思います。
その為、もりもりさんの期待に添えるかどうか判りません。

# もりもりさん自身が、この機能をどう取り入れるかに因ります。

また、ご自分で実装された方が勉強にもなりますし、良いかと思われます。
偉そうなこと言って申し訳ありませんが、ご自分ではどこまで実装されたのでしょうか?


機能としては、

 1. MDIFormに対してParentとなった瞬間にFormをリストを加える。
 2. MDIFormからFormがRemoveされた時にリストから外す。(この時、再ナンバリングしなければなりません)
 3. コンテキストメニューから選択されたFormをActiveにする。
 4. 直接FormをClickした場合はリストのチェックを同期させる。

となると思いますので、機能をブロックとして整理すると結構単純な作業だと思います。

もりもりさんが、どうやってこの機能を利用するか判りませんが、私の実装方法の概略を記しておきます。
汎用性を重視してるつもりです。ちょっとしたアドバイスになれば幸いです...。

 MDIFormにContextMenuをプライベートに保持しておき、
 ChildFormでのMouseClick(Right)で、プロパティを通してShow() メソッドをCallするようにします。
 このChildFormは、これまたMDIFormにプライベートに別名として保存しておくと管理が楽です。
 安全性・汎用性を重視するために、MDIFormをBaseFormとして継承させる実装を考えます。

 ※MdiChildActivateイベントは不都合が起きそうですので、ChildForm側のActivateを使った方が良いでしょう。

この実装ですと、MDIFormに継承させるだけで、どんなFormが追加されようと対応できます。
どうしても実装方法が、わからない場合は「どこが」わからないか教えて頂けると答えやすいです。

# すべてソース側で説明するのは、骨が折れるってとこです...
# 私の能力不足もあるかと思いますが... (T_T)

まあ、ソースをそのまま添付しちゃってもいいんですけど、過去ログに入ると添付ファイル消えてしまうので...
java.lang.Nullpoさん、度々のご回答ありがとうございます。
私の説明が足らず、申し訳ありません。

> 今回、コンテキストメニューの直下に属すようにするため、
> MenuItem.MdiList = True によるリスト表示ができない仕様ですよね?
> ということは、ほぼ手作りになるのは、お判りになられますでしょうか?
MdiListをTrueにしたリスト表示をしつつ、画面の右クリックでも表示する仕様です。
メニューバーまでマウスカーソルを移動させてしまえばいいのですが、その場でもリスト
メニューを表示したいと要望されたのです。


>
> # もりもりさん自身が、この機能をどう取り入れるかに因ります。
>
> また、ご自分で実装された方が勉強にもなりますし、良いかと思われます。
> 偉そうなこと言って申し訳ありませんが、ご自分ではどこまで実装されたのでしょうか?
いえ、java.lang.Nullpoさんのおっしゃる通りです。
実装出来ない状態が続き、ちょっと焦っていたので、自分のソースも載せず質問してしまいました。

実際、自分でも挑戦してみたのですが、以下のようなPGを行うとサンプルで頂いたメニューを
例にいうと「ウィンドウ」の個所から表示され、リストの内容は一度、「ウィンドウ」を
クリックして表示しないと反映されません。
 
Private Sub Command_MouseDown(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown

  Dim mp As Point = PointToClient(Cursor.Position)
  ContextMenu1.Show(Obj_My_Form, mp)

End Sub

Private Sub ContextMenu1_Popup(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ContextMenu1.Popup

 Dim menuItem1 As New MenuItem("&Copy")
 Dim menuItem2 As New MenuItem("&Find and Replace")
 Dim menuItem3 As New MenuItem("C&hange Picture")
 Dim wk_control As Control

 ContextMenu1.MenuItems.Clear()
 menuItem1 = Obj_My_MDIForm.Window_Control.MergeMenu()
 ContextMenu1.MenuItems.Add(menuItem1)
End Sub

>  MDIFormにContextMenuをプライベートに保持しておき、
>  ChildFormでのMouseClick(Right)で、プロパティを通してShow() メソッドをCallするようにします。
>  このChildFormは、これまたMDIFormにプライベートに別名として保存しておくと管理が楽です。
>  安全性・汎用性を重視するために、MDIFormをBaseFormとして継承させる実装を考えます。
>
>  ※MdiChildActivateイベントは不都合が起きそうですので、ChildForm側のActivateを使った方が良いでしょう。
>
> この実装ですと、MDIFormに継承させるだけで、どんなFormが追加されようと対応できます。
> どうしても実装方法が、わからない場合は「どこが」わからないか教えて頂けると答えやすいです。

私自身、VB.NETを始めたばかりで理解できず申し訳ないのですが、以下の2点がよく分かりません。
・プロパティを通してShow()メソッドをCallするようにします。
・MDIFormをBaseFormとして継承させる実装を考えます。

>
> # すべてソース側で説明するのは、骨が折れるってとこです...
> # 私の能力不足もあるかと思いますが... (T_T)
いえ、とんでもありません。
ご回答を頂けるだけでも大変助かります。
お手数をお掛けしますが、よろしくお願いします。
こんにちは、もりもりさん。

■No6390に返信(もりもりさんの記事)
> java.lang.Nullpoさん、度々のご回答ありがとうございます。
> 私の説明が足らず、申し訳ありません。
いえ、気になさらないでください。

> 「ウィンドウ」の個所から表示され、
ごめんなさい、[↓]そういう意味で言ったつもりです。(うう、ヘンな日本語だ...)

引用:---------------------------------------------------------------------

> > 今回、コンテキストメニューの直下に属すようにするため、
> > MenuItem.MdiList = True によるリスト表示ができない仕様ですよね?

--------------------------------------------------------------------------


> 私自身、VB.NETを始めたばかりで理解できず申し訳ないのですが、
> 以下の2点がよく分かりません。

> ・プロパティを通してShow()メソッドをCallするようにします。
はい、これはFormに属するコントロールを直接アクセスするのはオブジェクト指向言語の概念を壊してしまうので、
プロパティを通して隠蔽化(Privateと言ったほうが良いでしょうか?)のメンバをアクセスした方が良いということです。
プロパティ プロシージャ自体については、以下が参考になるでしょうか。VB6と殆ど同じですが。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vblr7/html/vastmproperty.asp

# まあ別に直接アクセスしても問題なく動きますけどね。(^_^;)

> ・MDIFormをBaseFormとして継承させる実装を考えます。
これは、一言では言い表せないので、

継承の概略
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcn7/html/vaconinheritanceforbasiclanguage.asp

継承方法 (Inherits [クラス名]って書くだけですが...)
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vblr7/html/vastmInherits.asp

いきなり全てを理解しなくても良いと思います。
初めは、継承元となる親クラス(この場合だとBaseForm)の
機能(メソッドとかプロパティとか)を引き継ぐ程度に考えてもいいでしょう。
つまり、汎用性の高いクラスを作ると開発が楽になるってことですね。

# 便利だからといって、継承の多用は禁物ですが...。

DOBON.NET | プログラミング道 | プログラミング掲示板