VB.NETのMDIアプリについて

このQ&Aのポイント
  • VB.NETのMDIアプリについて、親フォームと子フォームの表示方法について説明します。
  • VB.NETのMDIアプリでは、親フォームのLoadイベントで子フォームを表示させることができます。
  • しかし、子フォームを親フォームの内部に表示するためには、親フォームのMdiParentプロパティに親フォーム自体を指定する必要があります。
回答を見る
  • ベストアンサー

VB.NETのMDIアプリについて

現在VB.NET EXP 2008を用いてMDIアプリを作成しています。 下記のような3種類のフォームを作成し,アプリ開始時にMAINの中にMENUを表示させ, MENU上のボタンをクリックすると,MASTERを表示させたいと考えています。 親フォーム : MAIN 子フォーム : MENU 子フォーム : MASTER まずはMAINのLoadイベントで Dim fMENU As New MENU fMENU.MdiParent = Me fMENU.Show() と記述して実行するとMENUがMAIN内に表示されます。 次に,MENU上のボタンクリックイベントで Dim fMASTER as New MASTER Dim fMAIN as New MAIN fMASTER.MdiParent = fMAIN fMASTER.Show() として実行してもMASTERが表示されません。 そこで,MAINのLoadイベントに Dim fMASTER as New MASTER fMASTER.MdiParent = Me と追記し,MENU上のボタンクリックイベントに Dim fMASTER as New MASTER fMASTER.Show() として実行すると,MASTERは表示されますが, MAINの外側に表示されてしまいます。 どのようにすれば,MAIN内にMASTERを 表示させることが出来ますでしょか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

補足情報有難うございました。 まだ、少々動作について疑問点がありますが、下記のコードと目的の動作と、どのように違うのか教えてください。 Public Class MAIN Private Sub MAIN_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Shown Dim fMENU As New MENU fMENU.MdiParent = Me Dim fMASTER As New MASTER fMASTER.MdiParent = Me fMENU.MdiParent = Me fMENU.Show() End Sub End Class Public Class MENU Dim fMASTER As New MASTER Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click fMASTER.Show() End Sub End Class Public Class MASTER Private Sub MASTER_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load Dim fMAIN As New MAIN Me.MdiParent = MAIN End Sub End Class お手数おかけします。 宜しくお願いします。

con014057
質問者

お礼

ありがとうございます。 上記のコードを実行したところ,実現したい通りに動作しました。 MASTERのLoadイベント内のMe.MdiPArent にfMAINを指定していたのが問題だったようでした。 ご丁寧にご回答いただき本当にありがとうございました。

その他の回答 (3)

回答No.4

たびたび申し訳ありません。 >MENUとMASTERは両方ともMAINの子にしたいと考えています。 補足情報に上記の記入がありましたので、MENUとMASTERが両方ともMAINの子になっているか、確認のコードを追加しました。 実行した結果、MENUとMASTERの両方ともMAINの子になっているようです。 Public Class MAIN Private Sub MAIN_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Shown '下記のコードを追加しました。 '------------------------------------- Dim mitem As New MenuItem("開く") mitem.MdiList = True Me.Menu = New MainMenu Me.Menu.MenuItems.Add(mitem) '------------------------------------- Dim fMENU As New MENU fMENU.MdiParent = Me Dim fMASTER As New MASTER fMASTER.MdiParent = Me fMENU.MdiParent = Me fMENU.Show() End Sub End Class

回答No.3

すいません、追記です。 MDIは、デザイナー画面でIsMdiContainer をTrueにしています。

回答No.1

こんばんは ご質問の内容は、 親フォーム→MAIN 子フォーム→MENU 孫フォーム→MASTER のような関係でしょうか? 親フォーム「MAIN」の中に子フォーム「MENU」を表示 子フォーム「MENU」の中に孫フォーム「MASTER」を表示 だとすると、おそらく、そうとう難しい操作だと思います。 以前これをやろうと思い、いろいろ調べましたが、どこかに「以上のような操作はできない」ようなことが書いてありました。 また、質問の内容と回答が違ってましたら、ごめんなさい。 その場合は、どこがどのように違うのか、補足していただけると、他の方が回答しやすくなるかもしれませんね。 お力になれなくてすいません。

con014057
質問者

お礼

ご回答ありがとうございます。 MENUとMASTERは両方ともMAINの子にしたいと考えています。 MAINのLoadイベントに Dim fMENU As New MENU Dim fMASTER As New MASTER fMENU.MdiParent = Me fMASTER.MdiParent = Me fMENU.Show() fMASTER.Show() と書いて実行した時のような状態を,MENUのボタンクリック時に行いたいと考えています。

関連するQ&A

  • VB.NETでフォーム間でのコントロールの参照

    VB.NETでフォーム間でのコントロールの参照が うまくいかず困っています Windows フォーム Form1とForm2があります Form1にはリストビュー(name:ListView1)を配置しています Form1_LoadイベントでListView1にアイテムを追加します Form2を表示し、Form1のListView1のアイテム数を、 取得しようとすると 0 になってしまします どうすればForm2から取得できるのでしょうか? 次のように書いています Form1_Load イベント内 ListView1.Items.Add("Item1") ListView1.Items.Add("Item2") ListView1.Items.Add("Item3") MessageBox.Show(CStr(ListView1.Items.Count), "Form1") Dim Form2 As New Form2() Form2.Show() Form2_Load イベント内 Dim Form1 As New Form1() MessageBox.Show(CStr(Form1.ListView1.Items.Count), "Form2")

  • 子フォームから開いたフォームと親子関係を結びたい(VB2003)

    子フォームから開いたフォームと親子関係を結びたい(VB2003) VB.NET2003についての質問です。 formMain のクラスに以下のコードを書いて実行させると、form1がformMainの子フォームとして開きます 下記は、「form1」を「formMain」の子フォームとして開くコードです。 (formMainクラス内のコードです)   ------------------------------   Dim f As New form1   Me.IsMdiContainer=True   f.MdiParent=Me   f.Show   ------------------------------ form1には、form2を開くボタンが用意されています。 質問内容は、このform2を、formMainの子フォームとして開くにはどうすればよいか、ということです。 ためしに、form1クラスに以下のコードを書いて実行させたところ、 「formMainは型であるため、式として利用することができない」というエラーメッセージが出てしまいました。   ------------------------------   Dim f As New form2   f.MdiParent = formMain   f.Show()   ------------------------------ 以上、よろしくお願い致します。

  • VB.netで標準モジュールからフォームを呼び出す

    お世話になります。 標準モジュールから以下のようにフォームを呼び出しているんですがうまく表示されません。 どこが悪いんですか? 標準モジュール内----------------------   Public Sub Main()     Dim frm1 As New Form1     frm1.Show()   End Sub

  • VB2010でMDI親フォームから子フォームを表示

    VB2010でソフトを作っております。 MDI親フォームから子フォームを表示させたいのですが…。 過去に少しだけVB6を使っていたことがありますが、クラスという概念に苦労しております インスタンスや初期化といったところをうまく扱えばとは思うのですが、よろしくご指導お願いいたします。 1.MDI親フォーム(Form1)のボタンを押し、子フォーム(Form2)を表示させる 2.子フォームが表示されていなかったら表示させる 3.子フォームが表示されていたら何もしない これだけの事ですがずいぶん悩んでおります。 全コードがこれです。 Public Class Form1 Private f2 As New Form2 Private Sub Form1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.IsMdiContainer = True End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim fChild As Form() = Me.MdiChildren For Each f As Form In fChild If f.Text = "Form2" Then Exit Sub End If Next f2 = New Form2 f2.MdiParent = Me f2.Show() f2.Activate() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click If f2 Is Nothing OrElse f2.IsDisposed Then f2 = New Form2 f2.MdiParent = Me End If f2.Show() f2.Activate() End Sub End Class ボタン1でもボタン2でも、期待する動作はするのですが、 ボタン1ではアクティブになっているフォームの名前を力技で取得している気がして… ボタン2では子フォーム(Form2)をすでに表示している状態でもさらにShowをしているのが気に入らなくて… もっとスマートな方法がありましたら、ご指導お願いします。

  • VB2008でMDIフォームを使用した時の不具合

    お世話になります。 VB2008でMDI親フォームから 子フォームを表示して子フォーム内のイベントから クラスモジュールを生成してフォーム内のリストに 表示処理を行っているのですが、クラスは確かに 呼ばれているのですが子フォーム内のリストに データが表示されません。 親フォームに Me.IsMdiContainer = True FRM = New FRMZIP With FRM .MdiParent = Me .Show() End With 以外に子フォームのオブジェクト定義が 必要なのでしょうか? VBは6.0以降殆ど実務では経験ありません。 宜しくお願いいたします。 PS 子フォームを単体で起動すると普通に 動作します。

  • VB2005 複数のフォームを同時に開く方法

    独学でVBを勉強している者です。 どうしてもわからないことがあるので、教えて下さい。 作ろうとしているのは、あるボタンを押すと、 別々のフォームが同時に開く処理なんですけど、上手くいかないんです。 dim A as new FormA dim B as new FormB A.show() B.show() のようにしても、 FormA.show() FormB.show() としても、 FormBしか画面に表示されないんです。 FormAのほうはタスクバーにだけ表示されます。 いろいろ調べたのですが原因がさっぱりわからないので、 もしお分かりの方がいたらヒントだけでも教えて下さい。 宜しくお願い致します。

  • MDIで、子フォームのみWPF

    winformで作ったアプリケーションに、MDIの導入を考えています。と同時にWPFにも興味があるのですが、MDIで作られる子フォームのみWPFにすることは可能でしょうか? 親winform⇒子winformの場合 //Form4はwindowsform Form4 childform = new Form4(); childform.MdiParent = this; childform.Show(); このように書いています。 それを 親winform⇒子WPFで //UserControl1はユーザーコントロールWPF UserControl1 childform = new UserControl1(); childform.MdiParent = this; childform.Show(); このように書いてみたのですが、エラーで使えませんでした。 MdiParentとShowに赤い線が引かれ、 自動機能で MdiParentには public Form1 MdiParent { get; set; } Showには internal void Show(){ throw new NotImplementedException(); } が、作られましたが解決には至りませんでした。 環境はvisualstdio2013でC#です。 そもそも子formのみWPFは可能なのでしょうか? 可能であれば、方法を教えてください。

  • Hideについて(.NET)

    Form1をHideで非表示にし、Form2を開いた後、再びForm1を表示したいのですがうまくいきません。 [form1のイベント] Dim frmForm2 as New Form2 frmForm2.Show Me.hide Sub End [form2のイベント] Dim frmForm1 as New Form1 frmForm1.Show Me.Close Sub End としてあります。 非表示されたフォームを再表示されずに、新しくフォームが開いてしまっていると考えられるんですが、どうしたらよいでしょうか? 

  • VB2005のMDIについて

    はじめまして。現在、VB2005で開発しております。 MDIの操作で判らないところがありますので、ご存知の方がいましたら、教えてください。 MDIで開発しております。親フォームで発生したイベント内で子フォームに対してコントロール操作(画面を操作する関数を実行)を行うのですが、画面は全く動作しません。 ※デバックで確認するとコントロール操作しております。 対象の子フォームは必ず表示されていますが、必ずしも最前面にはいません。 今回のように親フォームから子フォームのメソッドを実行する際に動作する方法を教えてください。それとも、操作することは不可なのでしょうか。宜しくお願いします。

  • ふと疑問に思ったこと。

    現在VB2008をのんびり勉強中のものです。 ふと疑問に思ったのですが、VB6時代では Load フォーム名 で、対象フォームのLoadイベントのみを発生させることができました。 これだと、見た目上フォームを表示せずにLoadイベントを発生させることができました。 同様のことをVB2008でもやってみようと思ったのですが、 フォーム名 = New Form で初期化。 Loadだけを読み込もう・・・・あれ?フォーム先のイベントを何か発生させないとLoadされないぞ!? っていうことに気付きました。 フォーム名.showだとフォームが表示されてしまうし・・・ とりあえずshowで表示させた後、すぐにhideで隠してしまえばいいのですが、もっとスリムなやり方はありますでしょうか???

専門家に質問してみよう