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

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

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


Back Issue
1
AppオブジェクトからMyオブジェクトへ
2
ClipboardオブジェクトとMy.Computer.Clipboardオブジェクト
3
ココが違う! VB 6と.NETのコントロール・コレクション
4
アップグレード・ウィザードもお手上げ? VB 6と.NETの印刷の違い

 今回取り上げるVisual Basic 6.0(以下VB 6)の特殊オブジェクトは、MDIFormオブジェクトとMenuコントロールの2つです。

 VB 6では、プロジェクトの中に1つだけしか追加できない特別なフォームとして「MDIフォーム」(MDIFormオブジェクト)が用意されています。MDIフォームをプロジェクトに追加し、通常のフォームのMDIChildプロパティをTrueに設定することによって、MDIフォームの子フォームとしてそのフォームが表示されるという仕様です。

 一方、Menuコントロールはほかのコントロールとは異なり、ツールボックスからフォームに貼り付けることはできません。フォームのコンテキスト・メニューからメニュー・エディタを起動し、Menuコントロールの追加、設定を行います。このように、MDIFormオブジェクトとMenuコントロールはどちらも、ちょっと特殊な存在となっています。

 今回の特殊オブジェクトでは、プロパティ・ウィンドウやメニュー・エディタを使わなければ設定できない項目がいくつか存在しますので、まずは変換するVB 6のプロジェクトについて簡単に説明します。

VB 6のMDIフォームとメニュー・エディタ

 今回サンプルとして作成したVB 6プロジェクトは、下記の図1のように、

  • 1つのMDIフォーム(MDIForm1)
  • MDIChildプロパティがTrueに設定された3つのフォーム(Form1、Form2、Form3)

で構成されています。プロジェクトのスタートアップはMDIForm1です。


図1 プロジェクトの構成(VB 6)
MDIForm1がMDIフォーム、Form1、Form2、Form3がフォームとなっている。3つのフォームのMDIChildプロパティは、実行時には読み取り専用であるためプロパティ・ウィンドウから設定する必要がある。

 MDIForm1には、VB 6のメニュー・エディタを使って図2のようなメニューを設定しています。


図2 VB 6のメニュー・エディタによるメニューの設定
VB 6では、メニュー・エディタでメニューを設定することで、フォームにMenuコントロールを追加できる。

 トップのメニューである「ウィンドウ」の項目のみ[ウィンドウリスト]チェックボックスにチェックを入れ、MDI子フォームの一覧をメニューとして表示されるように設定しています(後掲の図3参照)。

 そのほかのメニュー項目については、以下の表のとおりにキャプションと名前だけを設定しています。

キャプション 名前
ウィンドウ MenuWindow
レイアウト MenuLayout
重ねて表示 MenuWindowCascade
上下に並べて表示 MenuWindowTileVertical
左右に並べて表示 MenuWindowTileHorizontal
最小化フォームを整列 MenuWindowArrangeIcons
最小化 MenuWindowMinimizeAll
元のサイズに戻す MenuWindowRestoreAll
各メニュー項目のキャプションと名前

 そしてMDIForm1のコードが下記のリスト1になります。選択されたメニュー項目に従って、いろいろなウィンドウ操作をすべてのMDI子フォームに対して一括して実行するプログラムとなっています。

Private Sub MDIForm_Load()

  ' 各MDI子フォームをロードします。
  Load Form1
  Load Form2
  Load Form3

End Sub

Private Sub MenuWindowCascade_Click()

  ' MDI子フォームを重ねて表示します。
  MDIForm1.Arrange vbCascade

End Sub

Private Sub MenuWindowTileHorizontal_Click()

  ' MDI子フォームを左右に並べて表示します。
  MDIForm1.Arrange vbTileHorizontal

End Sub

Private Sub MenuWindowTileVertical_Click()

  ' MDI子フォームを上下に並べて表示します。
  MDIForm1.Arrange vbTileVertical

End Sub

Private Sub MenuWindowArrangeIcons_Click()

  ' 最小化したMDI子フォームを整列します。
  MDIForm1.Arrange vbArrangeIcons

End Sub

Private Sub MenuWindowMinimizeAll_Click()

  ' MDI子フォームを最小化します。
  SetWindowStateAll (vbMinimized)

End Sub

Private Sub MenuWindowRestoreAll_Click()

  ' MDI子フォームを元のサイズに戻します。
  SetWindowStateAll (vbNormal)

End Sub

Private Sub SetWindowStateAll(state As FormWindowStateConstants)

  Dim currentForm As Form

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

End Sub
リスト1 MDIForm1のコード(VB 6)

 このサンプル・プロジェクトの実行画面は、下記の図3のようになります。


図3 プロジェクトの実行画面(VB 6アプリケーション)

 では、アップグレード・ウィザードを使ってこのプロジェクトをVisual Basic 2005(以下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