連載:アップグレード・ウィザードに学ぶVB 6→VB 2005

第5回 .NETではこう変わる! VB 6のMDIフォームとメニュー

グレープシティ株式会社 八巻 雄哉
2007/05/15
Page1 Page2 Page3

VB 2005にMDIFormオブジェクトは存在しない

 変換されたプロジェクトを見ると、まずMDIForm1がそのほかのForm1やForm2と同じFormオブジェクトになっていることが分かります(図4)。



図4 各フォームを選択したときのプロパティ・ウィンドウでの表示(VB 2005)
MDIForm1(上)もForm1(下)もFormクラス(System.Windows.Forms名前空間)の派生クラスとして宣言されている。

 VB 2005にMDIFormというオブジェクトやクラスは存在しません。VB 2005では、通常のFormオブジェクトにおいて、IsMdiContainerプロパティがTrueに設定されているものがMDIフォームとなります。変換されたプロジェクトのMDIForm1のIsMdiContainerプロパティをプロパティ・ウィンドウで確認すると、確かにTrueに設定されていることが分かります。

 なお、VB 6の場合、MDIフォームの背景色はBackColorプロパティを設定することで変更できましたが、VB 2005ではMDIフォームの背景色を変更することはできません。Pictureプロパティを使って背景画像を設定していた場合も同様ですので注意が必要です。

 一方、MDI子フォームとなる側のフォームでは、そのMDIParentプロパティに親となるMDIフォームを設定します。MDIParentプロパティはプロパティ・ウィンドウから設定することはできないので、コードから設定します。

 変換されたプロジェクトでは、Windowsフォーム・デザイナによって自動生成されたコードが記述されている.Designer.vbファイル(Form1.Designer.vbなど)*にMDIParentプロパティを設定するコードが存在するのを確認できます。

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> Partial Class Form1
#Region "Windows フォーム デザイナによって生成されたコード "
  <System.Diagnostics.DebuggerNonUserCode()> Public Sub New()
    MyBase.New()
    ' この呼び出しは、Windows フォーム デザイナで必要です。
    InitializeComponent()
    ' このフォームは MDI 子フォームです。
    ' このコードは自動的に
    ' MDI 子フォームの親を 読み込んで
    ' 表示し、Visual Basic 6 の
    ' 機能をシミュレートします。
    Me.MDIParent = Project1.MDIForm1
    Project1.MDIForm1.Show
  End Sub
  ……
リスト2 自動生成されたForm1.Designer.vbファイルのコードの一部(VB 2005)
コンストラクタ部分にMDIParentプロパティを設定するコードが記述されている。

* .Designer.vbファイルはデフォルトの状態ではソリューション・エクスプローラに表示されていません。Visual Studio 2005のメニューから[プロジェクト]−[すべてのファイルを表示]を実行するか、ソリューション・エクスプローラの上部にある[すべてのファイルを表示]ボタンをクリックする必要があります。

 このような仕様になっているため、VB 6のようにプロジェクトには1つのMDIフォームしか作成できないという制限はなく、VB 2005ではいくつでもMDIフォームを作成することができます。

VB 2005にメニュー・エディタは存在しない

 VB 2005にメニュー・エディタは存在しません。通常のコントロールと同様、ツールボックスからMenuStripコントロールをフォームにドラッグ&ドロップするという操作で、フォームにメニューを追加します。

 各メニューのテキスト(VB 6ではキャプション)は、フォームに表示されているメニューから直接入力することができます。そのほかの設定についてはプロパティ・ウィンドウを使って設定します。


図5 Windowsフォーム・デザイナ上に表示されるメニュー(MenuStripコントロール)

 変換されたプロジェクトのMDIForm1のメニューを見ると、各メニューのテキストは問題なくそのまま移行されているのですが、VB 6の[ウィンドウリスト]チェックボックス(WindowListプロパティ)を使って実現していたMDI子フォームの一覧をメニューとして表示する機能は移行されていません。

 しかしながら、同じ機能はVB 2005のMenuStripコントロールにも用意されており、やはりプロパティ1つで簡単に実現することができます。変換されたプロジェクトの場合、MainMenu1という名前のMenuStripコントロールを選択し、プロパティ・ウィンドウからMdiWindowListItemプロパティにMenuWindowを設定します。

アップグレード・ウィザードで変換されたコード

 最後に、変換されたプロジェクトのMDIForm1のコード部分について見ていきましょう。リスト1のコードを変換した結果が次のリスト3になります。

Option Strict Off
Option Explicit On
Friend Class MDIForm1
  Inherits System.Windows.Forms.Form
  Private Sub MDIForm1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load

    ' 各MDI子フォームのインスタンスを生成します。
    Dim childForm1 As New Form1
    Dim childForm2 As New Form2
    Dim childForm3 As New Form3

    ' 各MDI子フォームを表示します。
    childForm1.Show()
    childForm2.Show()
    childForm3.Show()

  End Sub

  Public Sub MenuWindowCascade_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MenuWindowCascade.Click

    ' MDI子フォームを重ねて表示します。
    Me.LayoutMDI(System.Windows.Forms.MDILayout.Cascade)

  End Sub

  Public Sub MenuWindowTileHorizontal_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MenuWindowTileHorizontal.Click

    ' MDI子フォームを左右に並べて表示します。
    Me.LayoutMDI(System.Windows.Forms.MDILayout.TileHorizontal)

  End Sub

  Public Sub MenuWindowTileVertical_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MenuWindowTileVertical.Click

    ' MDI子フォームを上下に並べて表示します。
    Me.LayoutMDI(System.Windows.Forms.MDILayout.TileVertical)

  End Sub

  Public Sub MenuWindowArrangeIcons_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MenuWindowArrangeIcons.Click

    ' 最小化したMDI子フォームを整列します。
    Me.LayoutMDI(System.Windows.Forms.MDILayout.ArrangeIcons)

  End Sub

  Public Sub MenuWindowMinimizeAll_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MenuWindowMinimizeAll.Click

    ' MDI子フォームを最小化します。
    SetWindowStateAll((System.Windows.Forms.FormWindowState.Minimized))

  End Sub

  Public Sub MenuWindowRestoreAll_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MenuWindowRestoreAll.Click

    ' MDI子フォームを元のサイズに戻します。
    'UPGRADE_ISSUE: vbNormal をアップグレードする定数を決定できません。 詳細については、'ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?keyword="B3B44E51-B5F1-4FD7-AA29-CAD31B71F487"' をクリックしてください。
    SetWindowStateAll((vbNormal))

  End Sub

  Private Sub SetWindowStateAll(ByRef state As System.Windows.Forms.FormWindowState)

    Dim currentForm As System.Windows.Forms.Form

    ' Formsコレクションを使ってすべてのフォームを取得します。
    For  Each currentForm In My.Application.OpenForms
      ' 取得したフォームがMDIフォーム以外の場合に
      ' WindowStateプロパティを変更します。
      If Not currentForm Is Me Then
        currentForm.WindowState = state
      End If
    Next currentForm

  End Sub
End Class
リスト3 MDIForm1のコード(VB 2005)

 以下では、ポイントとなる個所について順に見ていきます。


 INDEX
  アップグレード・ウィザードに学ぶVB 6→VB 2005
  第5回 .NETではこう変わる! VB 6のMDIフォームとメニュー
    1.VB 6のMDIフォームとメニュー
  2.VB 2005にMDIFormオブジェクト/メニュー・エディタは存在しない
    3.Option Strictステートメント/VB 6の定数/MdiChildrenプロパティ
 
インデックス・ページヘ  「アップグレード・ウィザードに学ぶVB 6→VB 2005」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH