ホーム ] アプリ ] コントロール ] クラスライブラリ ]

上へ
コンポーネント開発
グリッドコントロール
レギュラープレーヤ
数学関数表示コントロール

VB.NET2005 コントロール

コントロール開発技術解説

最終更新日:2007/04/26  全面改訂

 筆者がコントロールを開発するためのプロセスを紹介する。

●コンポーネント(コントロール)開発方法

 いくつかの方法がある。目的に応じて選ぶが、ここでは、ユーザコントロールを利用している。以下があるらしい。

○種類

・既存コントロールの改良、機能追加

 これは、例えばボタンに独自の機能を追加する場合などの方法で、そのコントロールを継承する。

複数のコントロールによる新機能の開発

 これは、コンテナになる標準のコントロールつまり、ユーザコントロールを利用し、既存のコントロールを複数貼り付け、新しい機能を付加するもの。ユーザコントロールは、Formsを継承しているので、ウィンドウフォームの開発にほぼ同じとなる。この場合、自分自身の外形の描画、再描画は自動的に行われるが、必要であればクライアント領域の描画もできる。

 .NETで、コントロール開発を選ぶとデフォールトで空白のユーザコントロールが生成される。通常は、この状態でほぼ必要なコントロールは開発できると思う。

・無から開発

 これは、コントロール(自分自身)の形状から自分で描画する本格的なもの。Controlを継承する。エンドプログラマにオーナードローをさせるなどの高度な機能も実装できる。

○デバッグ方法

 コンポーネント自体は単独で実行できないので、デバッグするホストが必要となる。通常は、ソリューションにウィンドウフォームアプリケーションのプロジェクトを追加し、そのアプリで、目的のコントロールを貼り付けて試験プログラムを組む。このとき、コントロール自体のコードディバッグのために、xxxxxx\bin\Releaseにある.dllを参照すると良い。これで、コントロール内でのアドレスストップやシングルステップ、変数、配列内容の観測ができる。

○プロパティ、メソッド、イベントの実装方法

 これらは、一般の書物や解説に拠られたい。

 但し、FreeGridは、簡易でお気楽コントロールなので、規則やしきたりは守っていない。自由自在となっている。

●イベントの捕捉

 エンドユーザと同列のイベント処理ではまずいことになる。

 このため、必要なイベントは、エンドユーザ(エンドプログラマ、つまり、このコントロールを使ってプログラムする者)より先に補足し、必要な処理をしないといけないこともある。

○OnXXXXXX関数

 基底クラスにあるイベント処理の関数で、通常は隠されているが、必要ならこれをオーバーライド*する。例えば、描画では、

 Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

とすれば、基底クラスの描画処理に乗り込める。ここで、エンドプログラマより先(先か後は個別問題であるが)に自分で描画できる。エンドプログラマにイベントを渡す場合は、

 MyBase.OnPaint(e)

とすれば良い。これで、エンドプログラマが記述したデリゲート(Paintイベント処理)を探し、それを呼び出すようになる。

→*
 オーバーライドとは英語としての本来の意味は、踏み倒す、無視するなどのあまり良い意味がない。この場合は、元の処理では不満なので、自分で(強引に)処理を付加する意味となる。

○実際

  • OnPaint は、コントロール自体の外形の再描画が必要な場合に起こる。移動、隠れていた部分が再び見えた場合などである。この場合、大抵はそのクライアント領域の再描画も必要となるので、Paintイベントが起こるのである。
  • エンドプログラマがPaintイベントを処理することがなければ、MyBase.OnPaint(e)は実装しなくて良い。
  • マウスの各イベントは先にコントロール側で必要な処理を行い、その後渡している。これで、エンドプログラマはマウスイベント処理で、必要な正しいFreeGrid状態を把握できる。

●開発の手順

 製品開発ではないので、お気楽に開発すれば良い。また、RADツール(VB.NET)を使っているのだから、最大限それを生かすのが良い。

○何が欲しいのか?

 初めにありき、ではなく、エンドユーザとして何が欲しいかである。つまり、ユースシナリオから始まる。例えば、FreeGridでは、

  • エクセルのような二次元の表を簡便に表示したい
  • 但し、演算機能はいらない
  • データは数値、文字列、日付、画像など
  • データソースは、個別、配列、データベースとする
  • 行またはセルを選択したい
  • 内容を更新したい
  • 縦、横のサイズは任意で、表示範囲は可変
  • 表示では、縦書きが欲しい
  • 見出しがあれば便利

が、始まりである。上記のような具体的でもあり漠然とした要望でもあるものを元に、必要な機能の抽象化を行う。

○抽象化

 以下の最小限の機能定義から出発した。RADなので、これらを実現しつつ、仕様を膨らませて行けば良い。VBの場合は、お決まりの部分や、お約束の部分は、隠蔽されており、システム側で自動的にコードされるので、プログラマは本来の仕様や機能に集中できるのである。

 プロパティ、メソッド、イベントの追加はものすごく簡単なので、初期に全てを決める必要はない。基本的に、それらが独立的であればあるほど、後での追加は全く他に影響なくできる。影響がある場合は、機能の抽象化がうまく行ってないことになる。