連載:VB 6ユーザーのための
これならマスターできるVB 2005超入門

第10回 今月は部品化月間 〜 ユーザー・コントロールを作成する

羽山 博
2007/07/17
Page1 Page2 Page3 Page4

■ユーザー・コントロールのプロパティをオーバーライドする

 ユーザー・コントロールにプロパティを追加する際、すでに存在しているプロパティ名を使いたいこともあるだろう。その場合は、PropertyプロシージャにOverridesキーワードを指定する。

 例えば、FontプロパティはIdeaCardコントロール自体のプロパティなのだが、この働きを変更し、IdeaCategoryコントロールとIdeaTextBoxコントロールのフォントを同時に取得・設定できるようにしてみよう。コードは次のようになる。

Public Overrides Property Font() As System.Drawing.Font

  Get
    Return MyBase.Font
  End Get

  Set(ByVal value As System.Drawing.Font)
    MyBase.Font = value
    IdeaTextBox.Font = value
    IdeaCategory.Font = value
  End Set

End Property
IdeaCardコントロールのFontプロパティを定義し直す
Fontプロパティは、ユーザー・コントロールIdeaCardそのもののプロパティだが、IdeaTextBoxコントロールとIdeaCategoryコントロールのフォントを取得・設定できるようにする。MyBaseは、それぞれのコントロールが配置されているフォーム、つまりIdeaCardコントロールのことを指す。

■ユーザー・コントロールにメソッドを追加する

 ユーザー・コントロールのメソッドは、Subプロシージャか、Functionプロシージャで記述する。値を返さない場合はSubプロシージャ、値を返す場合はFunctionプロシージャを使う。これはいわずもがなだろう。

 次のコードは、IdeaCardコントロールにAddメソッドを追加した例。このメソッドは、IdeaCardコントロールに含まれるComboBoxコントロールの「IdeaCategory」に項目を追加するためのものだ。

Public Sub Add(ByVal value As Object)
  IdeaCategory.Items.Add(value)
End Sub
IdeaCardコントロールのAddメソッドを定義する
Addメソッドを呼び出すと、引数に指定したオブジェクトがComboBoxコントロールの項目として追加される。

■ユーザー・コントロールにイベントを追加する

 ユーザー・コントロールには、プロパティとメソッドのほか、イベントも追加できる。先に触れたようにComboBoxコントロールはPrivateで宣言されているので、そのイベントも外部から利用することはできない。そこで、Publicなイベントを定義して、そのイベントを発生させるようにする。コードは以下のとおり。

 EventステートメントでSelectedIndexChangedイベントを宣言し、IdeaCategoryのSelectedIndexChangedイベント・ハンドラで(つまり、コンボ・ボックスの選択が変更されたときに)、RaiseEventステートメントを呼び出し、SelectedIndexChangedイベントが発生するようにする。

Public Event SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)

Private Sub SelectIndex(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IdeaCategory.SelectedIndexChanged
  RaiseEvent SelectedIndexChanged(sender, e)
End Sub
IdeaCardコントロールのSelectedIndexChangedイベントを定義する
  ユーザー・コントロールIdeaCardでSelectedIndexChangedというイベントが発生することを宣言しておく。
  IdeaCategoryコントロールのSelectedIndexChagendイベントが発生したら、 で宣言したIdeaCardコントロールのSelectedIndexChangedイベントが発生するようにする。イベントの引数はそのまま渡している。

 この働きを図で示すと、図12のようになる。ここでは、ユーザー・コントロールに含まれるComboBoxコントロールのSelectedIndexChangedイベントをユーザー・コントロールIdeaCardのSelectedIndexChangedイベントとして公開している形になるが、もちろん、自分で自由にイベントを定義することもできる。

図12 SelectedIndexChangedイベントを発生させる仕組み
  IdeaCategoryコントロールでSelectedChangedイベントが発生したら、 そのイベント・ハンドラの中でRaiseEventステートメントを使って、 IdeaCardコントロールのSelectedIndexChangedイベントを発生させる。

 以上で、ユーザー・コントロールにプロパティとメソッド、イベントを追加することができた。では最後に、これらを利用するプログラムを作ってみよう。サンプル・プログラム15を拡張させるといいだろう。ただし、その前に、[ビルド]−[SampleClassLibraryのビルド]を選択し、DLLファイルを作成し直しておく必要があることに注意。

サンプル・プログラム15の拡張 − ユーザー・コントロールのプロパティ、メソッド、イベントを利用するプログラム

 再び、サンプル・プログラム15で見たWindowsアプリケーションを開いて、コードを追加しよう。

 ここでは、ユーザー・コントロールの利用例を示すだけにとどめるので、以下の3つのコードを書いてみる。

  • Addメソッドを使ってコンボ・ボックスに項目を追加する
  • Fontプロパティを指定してフォントとサイズを変更する
  • コンボ・ボックスの選択が変更されたら、テキスト・ボックス部分の内容をメッセージ・ボックスに表示する

 もちろんユーザー・コントロールであっても、プロパティに関してはプロパティ・ウィンドウでも設定できるし、イベント・ハンドラはイベント一覧から追加できる。

Private Sub InitProc(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  IdeaCard1.Add("企画")
  IdeaCard1.Add("デザイン")
  IdeaCard1.Add("裏技")
  IdeaCard1.Font = New System.Drawing.Font("MS P明朝", 12)
End Sub

Private Sub showCategory(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IdeaCard1.SelectedIndexChanged
  MessageBox.Show(IdeaCard1.CategoryText)
End Sub
ユーザー・コントロールのプロパティ、メソッド、イベントを利用する
  Addメソッドを呼び出して、ユーザー・コントロール内のコンボ・ボックスに文字列を追加している。
  Fontプロパティを変更している。Font.Nameなどのプロパティは読み出し専用なので、IdeaCard1.Font.Name = "MS P明朝"のようには記述できないことに注意。
  SelectedIndexChangedイベント・ハンドラを記述している。メッセージ・ボックスにCategoryTextプロパティの値を表示する。

 このプログラムを実行すると、最初の図1に示した実行例のようなフォントとサイズで文字が表示される。また、コンボ・ボックスでの選択を変更すると、選択した項目がメッセージ・ボックスに表示される。

結び − さらに拡張するためのヒント

 今回は、プロパティとメソッド、イベントの一部を記述してユーザー・コントロールに含まれるコントロールを間接的に操作するようにしたが、直接操作できるようにすることもできる。

 例えば、TextBoxコントロール「IdeaTextBox」を直接操作できるようにするには、IdeaCardコントロールの[コード]ウィンドウで以下のようなコードを追加すればよい。

Public ReadOnly Property TextBox() As System.Windows.Forms.TextBox
  Get
    Return IdeaTextBox
  End Get
End Property
TextBoxコントロールへの参照を返すTextBoxプロパティの定義

 このPropertyプロシージャにより、TextBoxコントロールへの参照が返されるので、呼び出し側ではそのプロパティやメソッド、イベントをすべて利用できる。

 例えば、呼び出し側では以下のように書くといいだろう。

IdeaCard1.TextBox.Text = "企画内容をここに入力"

 TextBoxプロパティはReadOnlyだが、あくまでも返されるのはIdeaTextBoxコントロールへの参照なので、それを利用すればTextプロパティに値を代入することはできる(TextプロパティはReadOnlyではない)。

 ただし、このような方法でユーザー・コントロールに含まれるコントロールを直接利用できるようにすると、ユーザー・コントロールの目的から外れるプロパティの設定やメソッドの呼び出しもできてしまい、意図せぬトラブルが発生する可能性もある。ユーザー・コントロールに必要とされる機能が決まっているのであれば、設計段階でそれを明確にしておき、必要なプロパティやメソッドだけが使えるように制限しておくほうが望ましいだろう。

 また、今回のプログラムでは、ユーザー・インターフェイス部品を作成し、利用する手順に絞って説明しているので、実際にデータ・ベースに保存したり、検索したりする処理は記述していないが、連載第5回のコードなどと組み合わせれば実用的なアプリケーションを書くことも十分可能だ。

 もちろん、ユーザー・インターフェイスを持たない部品を作成することも簡単にできる。ユーザー・コントロールではなく、クラス・モジュールを追加し、前回説明した「クラス」の記述を利用するだけでいい。Windowsアプリケーションからは[プロジェクト]−[参照の追加]を選択して、ビルドしたDLLを参照するように指定しておけば、.NET Frameworkのクラス・ライブラリのクラスと同じように利用できる。

 さまざまな機能と組み合わせることによって、より柔軟な部品が開発でき、プログラミングの作成や保守の効率を高められるはずだ。読者諸氏の仕事の中で生かしていってもらえるとうれしく思う。End of Article


 INDEX
  連載:VB 6ユーザーのためのこれならマスターできるVB 2005超入門
  第10回 今月は部品化月間 〜 ユーザー・コントロールを作成する
    1.サンプル・プログラム14 − アイデアDBのためのユーザー・インターフェイス部品
    2.ユーザー・コントロールをデザインする
    3.サンプル・プログラム15 − ユーザー・コントロールを利用するプログラム
  4.サンプル・プログラム14の拡張 − プロパティとメソッドを追加する
 
インデックス・ページヘ  「これならマスターできる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