連載:VB 6ユーザーのための
|
|
|
■ユーザー・コントロールのプロパティをオーバーライドする
ユーザー・コントロールにプロパティを追加する際、すでに存在しているプロパティ名を使いたいこともあるだろう。その場合は、PropertyプロシージャにOverridesキーワードを指定する。
例えば、FontプロパティはIdeaCardコントロール自体のプロパティなのだが、この働きを変更し、IdeaCategoryコントロールとIdeaTextBoxコントロールのフォントを同時に取得・設定できるようにしてみよう。コードは次のようになる。
| |
IdeaCardコントロールのFontプロパティを定義し直す | |
Fontプロパティは、ユーザー・コントロールIdeaCardそのもののプロパティだが、IdeaTextBoxコントロールとIdeaCategoryコントロールのフォントを取得・設定できるようにする。MyBaseは、それぞれのコントロールが配置されているフォーム、つまりIdeaCardコントロールのことを指す。 |
■ユーザー・コントロールにメソッドを追加する
ユーザー・コントロールのメソッドは、Subプロシージャか、Functionプロシージャで記述する。値を返さない場合はSubプロシージャ、値を返す場合はFunctionプロシージャを使う。これはいわずもがなだろう。
次のコードは、IdeaCardコントロールにAddメソッドを追加した例。このメソッドは、IdeaCardコントロールに含まれるComboBoxコントロールの「IdeaCategory」に項目を追加するためのものだ。
| |
IdeaCardコントロールのAddメソッドを定義する | |
Addメソッドを呼び出すと、引数に指定したオブジェクトがComboBoxコントロールの項目として追加される。 |
■ユーザー・コントロールにイベントを追加する
ユーザー・コントロールには、プロパティとメソッドのほか、イベントも追加できる。先に触れたようにComboBoxコントロールはPrivateで宣言されているので、そのイベントも外部から利用することはできない。そこで、Publicなイベントを定義して、そのイベントを発生させるようにする。コードは以下のとおり。
EventステートメントでSelectedIndexChangedイベントを宣言し、IdeaCategoryのSelectedIndexChangedイベント・ハンドラで(つまり、コンボ・ボックスの選択が変更されたときに)、RaiseEventステートメントを呼び出し、SelectedIndexChangedイベントが発生するようにする。
| ||||||
IdeaCardコントロールのSelectedIndexChangedイベントを定義する | ||||||
|
この働きを図で示すと、図12のようになる。ここでは、ユーザー・コントロールに含まれるComboBoxコントロールのSelectedIndexChangedイベントをユーザー・コントロールIdeaCardのSelectedIndexChangedイベントとして公開している形になるが、もちろん、自分で自由にイベントを定義することもできる。
図12 SelectedIndexChangedイベントを発生させる仕組み | |||
|
以上で、ユーザー・コントロールにプロパティとメソッド、イベントを追加することができた。では最後に、これらを利用するプログラムを作ってみよう。サンプル・プログラム15を拡張させるといいだろう。ただし、その前に、[ビルド]−[SampleClassLibraryのビルド]を選択し、DLLファイルを作成し直しておく必要があることに注意。
サンプル・プログラム15の拡張 − ユーザー・コントロールのプロパティ、メソッド、イベントを利用するプログラム
再び、サンプル・プログラム15で見たWindowsアプリケーションを開いて、コードを追加しよう。
ここでは、ユーザー・コントロールの利用例を示すだけにとどめるので、以下の3つのコードを書いてみる。
- Addメソッドを使ってコンボ・ボックスに項目を追加する
- Fontプロパティを指定してフォントとサイズを変更する
- コンボ・ボックスの選択が変更されたら、テキスト・ボックス部分の内容をメッセージ・ボックスに表示する
もちろんユーザー・コントロールであっても、プロパティに関してはプロパティ・ウィンドウでも設定できるし、イベント・ハンドラはイベント一覧から追加できる。
| |||||||||
ユーザー・コントロールのプロパティ、メソッド、イベントを利用する | |||||||||
|
このプログラムを実行すると、最初の図1に示した実行例のようなフォントとサイズで文字が表示される。また、コンボ・ボックスでの選択を変更すると、選択した項目がメッセージ・ボックスに表示される。
結び − さらに拡張するためのヒント
今回は、プロパティとメソッド、イベントの一部を記述してユーザー・コントロールに含まれるコントロールを間接的に操作するようにしたが、直接操作できるようにすることもできる。
例えば、TextBoxコントロール「IdeaTextBox」を直接操作できるようにするには、IdeaCardコントロールの[コード]ウィンドウで以下のようなコードを追加すればよい。
| |
TextBoxコントロールへの参照を返すTextBoxプロパティの定義 |
このPropertyプロシージャにより、TextBoxコントロールへの参照が返されるので、呼び出し側ではそのプロパティやメソッド、イベントをすべて利用できる。
例えば、呼び出し側では以下のように書くといいだろう。
|
TextBoxプロパティはReadOnlyだが、あくまでも返されるのはIdeaTextBoxコントロールへの参照なので、それを利用すればTextプロパティに値を代入することはできる(TextプロパティはReadOnlyではない)。
ただし、このような方法でユーザー・コントロールに含まれるコントロールを直接利用できるようにすると、ユーザー・コントロールの目的から外れるプロパティの設定やメソッドの呼び出しもできてしまい、意図せぬトラブルが発生する可能性もある。ユーザー・コントロールに必要とされる機能が決まっているのであれば、設計段階でそれを明確にしておき、必要なプロパティやメソッドだけが使えるように制限しておくほうが望ましいだろう。
また、今回のプログラムでは、ユーザー・インターフェイス部品を作成し、利用する手順に絞って説明しているので、実際にデータ・ベースに保存したり、検索したりする処理は記述していないが、連載第5回のコードなどと組み合わせれば実用的なアプリケーションを書くことも十分可能だ。
もちろん、ユーザー・インターフェイスを持たない部品を作成することも簡単にできる。ユーザー・コントロールではなく、クラス・モジュールを追加し、前回説明した「クラス」の記述を利用するだけでいい。Windowsアプリケーションからは[プロジェクト]−[参照の追加]を選択して、ビルドしたDLLを参照するように指定しておけば、.NET Frameworkのクラス・ライブラリのクラスと同じように利用できる。
さまざまな機能と組み合わせることによって、より柔軟な部品が開発でき、プログラミングの作成や保守の効率を高められるはずだ。読者諸氏の仕事の中で生かしていってもらえるとうれしく思う。
INDEX | ||
連載:VB 6ユーザーのためのこれならマスターできるVB 2005超入門 | ||
第10回 今月は部品化月間 〜 ユーザー・コントロールを作成する | ||
1.サンプル・プログラム14 − アイデアDBのためのユーザー・インターフェイス部品 | ||
2.ユーザー・コントロールをデザインする | ||
3.サンプル・プログラム15 − ユーザー・コントロールを利用するプログラム | ||
4.サンプル・プログラム14の拡張 − プロパティとメソッドを追加する | ||
「これならマスターできるVB 2005超入門」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|
- - PR -