ユーザー コントロールは、カスタム グラフィカル インターフェイスの作成と再利用のための手段を提供します。ユーザー コントロールは、基本的には表示できる形式を持つコンポーネントです。そのため、ユーザー コントロールには、1 つ以上の Windows フォーム コントロール、コンポーネント、またはコード ブロックが含まれることがあります。これらの要素を使って、ユーザー入力の検証、表示プロパティの変更、または作成に必要なその他のタスクを実行することができ、機能を拡張できます。ユーザー コントロールは、他のコントロールと同じ方法で Windows フォームに配置できます。このチュートリアルでは、最初に ctlClock という名前の簡単なユーザー コントロールを作成します。チュートリアルの 2 番目の部分では、継承を使って ctlClock の機能を拡張します。
新しいプロジェクトを作成するときは、プロジェクト名を指定することによって、ルート パッケージ、アセンブリ名、およびプロジェクト名が設定され、既定のコンポーネントが適切なパッケージに含まれるようになります。
ctlClockLib コントロール ライブラリおよび ctlClock コントロールを作成するには
-
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックして [新しいプロジェクト] ダイアログ ボックスを表示します。
-
[Visual J# プロジェクト] ボックスの一覧の [Windows コントロール ライブラリ] プロジェクト テンプレートをクリックし、[プロジェクト名] ボックスに「ctlClockLib」と入力します。
既定では、ctlClockLib というプロジェクト名がルート パッケージにも割り当てられます。ルート パッケージは、アセンブリ内のコンポーネントの名前を限定するために使用されます。たとえば、ctlClock という名前のコンポーネントが 2 つのアセンブリに含まれる場合は、ctlClockLib.ctlClock という形で目的の ctlClock コンポーネントを指定できます。
-
ソリューション エクスプローラで UserControl1.jsl を右クリックし、ショートカット メニューの [コードの表示] をクリックします。
-
ソリューション エクスプローラで、UserControl1.jsl を右クリックし、[名前の変更] をクリックします。名前を UserControl1.jsl から ctlClock.jsl に変更します。
-
クラス定義とクラス コンストラクタを調べて、それぞれの名前が public class UserControl1 から public class ctlClock、public UserControl1() から public ctlClock() に変更されていることを確認します。
-
[ファイル] メニューの [すべてを保存] をクリックして、プロジェクトを保存します。
ユーザー コントロールへの Windows コントロールとコンポーネントの追加
ビジュアル インターフェイスは、ユーザー コンポーネントの基本的な部分です。このビジュアル インターフェイスは、1 つ以上のコントロールをユーザー コントロール デザイナに追加することによって実装されます。次の例では、コントロールをユーザー コントロールに取り込み、コードを作成して機能を実装します。
ラベルとタイマをユーザー コントロールに追加するには
-
ソリューション エクスプローラで ctlClock.jsl を右クリックし、[デザイナの表示] をクリックします。
-
ツールボックスの [すべての Windows フォーム] タブをクリックし、[label] をダブルクリックします。
label1 という名前のラベル コントロールが、ユーザー コントロール デザイナのコントロールに追加されます。
-
デザイナで [label1] をクリックします。[プロパティ] ウィンドウで、次のプロパティを設定します。
|
プロパティ
|
変更後の値
|
|
Name
|
lblDisplay
|
|
Text
|
(空白)
|
|
TextAlign
|
MiddleCenter
|
|
Font.Size
|
14
|
-
ツールボックスの [すべての Windows フォーム] をクリックし、[Timer] をダブルクリックします。
タイマはコンポーネントであるため、実行時には表示できる形式を持ちません。そのため、タイマはユーザー コントロール デザイナ上のコントロールと共には表示されず、コンポーネント トレイに表示されます。
-
コンポーネント トレイで、[timer1] をクリックし、Interval プロパティを 1000 に設定し、Enabled プロパティを True に設定します。
Interval プロパティは、タイマ コンポーネントが時を刻む頻度を制御します。timer1 が時を刻むたびに、timer1_Tick イベントのコードが実行されます。時を刻む間隔は、ミリ秒単位で表します。
-
コンポーネント トレイで、[timer1] をダブルクリックして、ctlClock の timer1_Tick イベントに移動します。
-
コードを次のように変更します。
// Visual J#
protected void timer1_Tick (Object sender, System.EventArgs e)
{
lblDisplay.set_Text(System.DateTime.get_Now().ToLongTimeString());
}
このコードは、現在の時刻を lblDisplay に表示します。timer1 の間隔は「1000」に設定されているため、このイベントは 1000 ミリ秒ごとに発生します。したがって、現在の時刻は 1 秒ごとに更新されます。
既定では、[timer1] のダブルクリックによって追加された timer1_Tick メソッドは、private スコープを持ちます。上のコード セグメントで、このスコープを protected に変更したことに注意してください。
-
[ファイル] メニューの [すべてを保存] をクリックしてプロジェクトを保存します。
ユーザー コントロールへのカスタム プロパティの追加
この時点で、作成した時計コントロールには、それぞれ固有のプロパティのセットを持つ Label コントロールと Timer コンポーネントがカプセル化されています。各コントロールのプロパティは、コントロールの後続のユーザーからはアクセスできませんが、適切なコード ブロックを作成することによってカスタム プロパティを作成および公開できます。次のセクションでは、コントロールにカスタム プロパティを追加して、ユーザーが背景色とテキストの色を変更できるようにします。
ユーザー コントロールにカスタム メンバを追加するには
-
ソリューション エクスプローラで ctlClock.jsl を右クリックし、ショートカット メニューの [コードの表示] をクリックします。
コード エディタが開きます。
-
public class ctlClock ステートメントを探します。始まりの中かっこ ({) の下に、次のように入力します。
// Visual J#
private Color colFColor;
private Color colBColor;
これらのステートメントは、これから作成するカスタム プロパティの値を格納するためのプライベート変数を作成します。
-
前の手順の変数宣言の下に、次のコードを追加します。
// Visual J#
/** @property */
public Color get_ClockBackColor()
{
return colBColor;
}
/** @property */
public void set_ClockBackColor(Color value)
{
colBColor = value;
lblDisplay.set_BackColor(colBColor);
}
/** @property */
public Color get_ClockForeColor()
{
return colFColor;
}
/** @property */
public void set_ClockForeColor(Color value)
{
colFColor = value;
lblDisplay.set_ForeColor(colFColor);
}
上のコードにより、このコントロールの後続のユーザーは、ClockForeColor と ClockBackColor の 2 つのカスタム プロパティを使用できるようになります。get_ ステートメントと set_ ステートメントは、カスタム プロパティの値を格納および取得し、適切な機能を実装するコードです。
-
[ファイル] メニューの [すべてを保存] をクリックしてプロジェクトを保存します。
コントロールはスタンドアロン アプリケーションではないため、コンテナでホストする必要があります。コントロールをテストするには、コントロールを実行するテスト プロジェクトを指定する必要があります。ここでは、コントロールを作成し、Windows フォームでそのコントロールをテストします。
コントロールをビルドするには
テスト プロジェクトを作成するには
-
[ファイル] メニューの [追加] をポイントし、[新しいプロジェクト] をクリックして [新しいプロジェクトの追加] ウィンドウを開きます。
-
[Windows アプリケーション] をクリックし、[プロジェクト名] ボックスに「Test」と入力します。
-
ソリューション エクスプローラで、Test プロジェクトの [参照設定] ノードを右クリックします。[参照の追加] をクリックして [参照の追加] ダイアログ ボックスを表示します。
-
[プロジェクト] タブをクリックします。[プロジェクト名] ボックスにユーザー コントロール プロジェクトの名前が表示されます。
プロジェクトをダブルクリックします。これで ctlClockLib Components という新しいタブがツールボックスに追加されました。
参照を追加した後で、コントロールをフォームに配置できます。
コントロールをテストするには
-
デザイン ビューに Form1 を表示した状態で、ツールボックスの [ctlClockLib コンポーネント] をクリックし、[ctlClock] を表すコントロール アイコンが表示されるまで、下にスクロールします。
-
[ctlClock] アイコンをダブルクリックします。
コントロールのコピーがフォームに追加されます。このコントロールには現在の時刻が表示され、毎秒ごとに更新されます。
-
アイコンを選択し、フォーム上にマウスを移動します。
-
フォーム上でマウスを移動する間、マウスの左ボタンを押したままにします。
コントロールのコピーがもう 1 つフォーム上に作成されます。必要に応じて、タイマのコピーをいくつでもフォームに追加できます。
-
デザイナで ctlClock のインスタンスの 1 つをクリックします。
このインスタンスのプロパティが [プロパティ] ウィンドウに表示されます。
-
[プロパティ] ウィンドウで ClockBackColor プロパティを選択して、カラー パレットを表示します。
-
任意の色をクリックして選択します。
コントロールの背景色が、選択した色に変更されます。
-
同様なイベントのシーケンスを使用して、ClockForeColor プロパティが予想どおりに機能することを確認します。
-
F5 キーを押し、[ユーザー コントロール テスト コンテナ] ウィンドウでこのコントロールを実行します。UserControl TestContainer の詳細については、「方法 : UserControl の実行時の動作をテストする」を参照してください。
-
[ユーザー コントロール テスト コンテナ] を閉じるには、[閉じる] をクリックします。
このセクションでは、コンポーネントと Windows コントロールをコードと結合し、ユーザー コントロールの形式にパッケージ化してカスタム機能を提供する方法を説明しました。ユーザー コントロールのプロパティを公開し、完了後にコントロールをテストする方法を学びました。次のセクションでは、ctlClock をベースとして使って、継承ユーザー コントロールを作成する方法を学びます。
前のセクションでは、再利用可能なユーザー コントロールに Windows コントロール、コンポーネント、およびコードを組み込む方法を学びました。このユーザー コントロールをベースにして、他のコントロールを作成できます。基本クラスからクラスを派生するプロセスを継承と呼びます。このセクションでは、ctlAlarmClock という名前のユーザー コントロールを作成します。このコントロールは、親コントロールの ctlClock から派生します。親メソッドをオーバーライドし、新しいメソッドやプロパティを追加して、ctlClock の機能を拡張する方法を学びます。
継承コントロールの作成
継承コントロールの作成の最初の手順は、親コントロールからの派生です。これにより、親コントロールのプロパティ、メソッド、およびグラフィカル特性をすべて持つ新しいコントロールが作成されます。このコントロールに基づいて、新しい機能を追加したり機能を変更したりできます。
継承コントロールを作成するには
-
ソリューション エクスプローラで、[ctlClockLib] をクリックします。
-
[プロジェクト] メニューの [ユーザー コントロールの追加] をクリックします。
[ユーザー コントロール] が選択された状態で [新しい項目の追加] ウィンドウが表示されます。
-
[ファイル名] ボックスに「ctlAlarmClock.jsl」と入力し、[追加] をクリックします。
[継承ピッカー] ウィンドウが表示されます。
-
[コンポーネント名] の [ctlClock] をダブルクリックします。
-
ソリューション エクスプローラで、現在のプロジェクトを参照します。ctlAlarmClock.jsl ファイルがプロジェクトに追加されていることを確認します。
アラーム プロパティの追加
ユーザー コントロールにプロパティを追加する場合と同じ方法で、継承コントロールにプロパティを追加できます。ここでは、プロパティ宣言構文を使って、コントロールに 2 つのプロパティを追加します。
ユーザー コントロールにプロパティを追加するには
-
ソリューション エクスプローラで [ctlAlarmClock] を右クリックし、[コードの表示] をクリックします。
-
public class ステートメントを探します。このコントロールが ctlClockLib.ctlClock を継承していることを確認します。public class ctlAlarmClock extends ctlClockLib.ctlClock { ステートメントの下に次のコードを追加します。
// Visual J#
private System.DateTime dteAlarmTime;
private boolean blnAlarmSet;
// These properties will be declared as public to allow future
// developers to access them.
/** @property*/
public System.DateTime get_AlarmTime()
{
return dteAlarmTime;
}
/** @property*/
public void set_AlarmTime(System.DateTime value)
{
dteAlarmTime = value;
}
/** @property*/
public boolean get_AlarmSet()
{
return blnAlarmSet;
}
/** @property*/
public void set_AlarmSet(boolean value)
{
blnAlarmSet = value;
}
コントロールのグラフィカル インターフェイスへの追加
継承したコントロールには、継承元のコントロールと同じビジュアル インターフェイスがあります。継承したコントロールには親コントロールと同じ内在コントロールがありますが、内在コントロールのプロパティは特に公開されない限り使用できません。任意のユーザー コントロールに追加する場合と同じ方法で、継承されたユーザー コントロールのグラフィカル インターフェイスに追加できます。引き続き、アラーム クロックのビジュアル インターフェイスに、アラームが鳴ったときに点滅するラベル コントロールを追加します。
ラベル コントロールを追加するには
-
ソリューション エクスプローラで [ctlAlarmClock] を右クリックし、ショートカット メニューの [デザイナの表示] をクリックします。
ctlAlarmClock のデザイナがメイン ウィンドウに表示されます。
-
コントロールの表示部分をクリックし、[プロパティ] ウィンドウの内容を確認します。
すべてのプロパティが表示されていますが、淡色表示されていることに注意してください。つまり、これらのプロパティは lblDisplay に対してネイティブであり、[プロパティ] ウィンドウでは変更もアクセスもできません。既定では、ユーザー コントロールに含まれるコントロールは private であり、そのプロパティにアクセスする方法はありません。
ヒント |
|---|
| コントロールの後続のユーザーが内部コントロールにアクセスできるようにするには、それらをパブリックまたはプロテクトとして宣言します。これにより、適切なコードを使用して、ユーザー コントロールに含まれるコントロールのプロパティを設定したり変更したりできるようになります。 |
-
ユーザー コントロールに Label コントロールを追加します。
-
マウスを使用して、ラベル コントロールを表示ボックスのすぐ下に移動します。[プロパティ] ウィンドウで、次のプロパティを設定します。
|
プロパティ
|
設定
|
|
Name
|
lblAlarm
|
|
Text
|
Alarm!
|
|
TextAlign
|
Middle Center
|
|
Visible
|
False
|
アラーム機能の追加
前のセクションでは、ユーザー コントロールのアラーム機能を使用できるようにするカスタム メンバおよびコントロールを追加しました。このセクションでは、現在の時刻とアラームの時刻を比較し、一致した場合は、アラームを点滅させるコードを追加します。ctlClock の timer1_Tick メソッドをオーバーライドして、ctlClock の固有の機能をすべて維持したまま、ctlAlarmClock の機能を拡張します。
ctlClock の timer1_Tick メソッドをオーバーライドするには
-
コード エディタで、private boolean blnAlarmSet; ステートメントを探します。このステートメントの直後に、次のステートメントを追加します。
// Visual J#
private boolean blnColorTicker;
-
クラス宣言が終わる直前に、次のコードを追加します。
// Visual J#
protected void timer1_Tick(Object sender, System.EventArgs e)
{
// Calls the timer1_Tick method of ctlClock.
super.timer1_Tick(sender, e);
// Checks to see if the alarm is set.
if (blnAlarmSet == false)
return;
else
// If the date, hour, and minute of the alarm time are the same as
// now, cause the display to flash.
{
if (dteAlarmTime.get_Date() == System.DateTime.get_Now().get_Date() &&
dteAlarmTime.get_Hour() == System.DateTime.get_Now().get_Hour() &&
dteAlarmTime.get_Minute() == System.DateTime.get_Now().get_Minute())
{
// Makes lblAlarm visible, and changes the backcolor based
// on the value of blnColorTicker. The backcolor of the
// label will flash once per tick of the clock.
lblAlarm.set_Visible(true);
if (blnColorTicker == false)
{
lblAlarm.set_BackColor( Color.get_Red());
blnColorTicker = true;
}
else
{
lblAlarm.set_BackColor(Color.get_Blue());
blnColorTicker = false;
}
}
else
{
// Once the alarm has sounded for a minute, the label is
// made invisible again.
lblAlarm.set_Visible(false);
}
}
}
このコードを追加することで、いくつかのタスクが実行されます。これにより、基本コントロールから継承したメソッドの代わりに、このメソッドがコントロールで使用されます。このメソッドを呼び出した場合、super.timer1_Tick ステートメントが呼び出されて、元のコントロールに組み込まれていたすべての機能がこのコントロールで再生されます。次に、追加のコードが実行され、アラーム機能が組み込まれます。アラームが作動すると、点滅するラベル コントロールが表示されます。
アラーム クロック コントロールは、ほとんど完成しています。後は、アラームを止める手段を実装するだけです。この方法を実装するには、ボタンを追加し、btnAlarmOff_Click メソッドにコードを追加します。
アラームを止める手段を実装するには
-
ソリューション エクスプローラで ctlAlarmClock.jsl を右クリックし、[デザイナの表示] をクリックします。
デザイナが表示されます。
-
コントロールにボタンを追加します。ボタンのプロパティを次のように設定します。
|
プロパティ
|
値
|
|
Name
|
btnAlarmOff
|
|
Text
|
Disable Alarm
|
-
デザイナで [Disable Alarm] をダブルクリックします。
コード エディタが開き、private void btnAlarmOff_Click 行が表示されます。
-
このメソッドを次のように変更します。
// Visual J#
private void btnAlarmOff_Click (Object sender, System.EventArgs e)
{
// Turns off the alarm.
blnAlarmSet = false;
// Hides the flashing label
lblAlarm.set_Visible(false);
}
-
[ファイル] メニューの [すべてを保存] をクリックしてプロジェクトを保存します。
継承コントロールのテスト
標準ユーザー コントロールと同様に、継承ユーザー コントロールはスタンドアロン型ではないため、フォームまたは他のコンテナでホストする必要があります。ctlAlarmClock には他にも機能があるため、テストを実行するには追加のコードが必要です。ここでは、ctlAlarmClock の機能をテストするための簡単なプログラムを記述します。ctlAlarmClock の AlarmTime プロパティを設定および表示するコードを作成し、固有の機能をテストします。
コントロールをビルドしてテスト フォームに追加するには
-
ソリューション エクスプローラで、[ctlClockLib] をクリックします。[ビルド] メニューの [ctlClockLib のビルド] をクリックします。
-
ソリューションに新しい Windows アプリケーション プロジェクトを追加し、Test2 という名前を付けます。
-
ソリューション エクスプローラで、テスト プロジェクトの [参照設定] ノードを右クリックします。[参照の追加] をクリックして [参照の追加] ウィンドウを表示します。[プロジェクト] タブをクリックします。[プロジェクト名] の一覧に [ctlClockLib] が表示されます。表示された [ctlClockLib] をダブルクリックして、[ctlClockLib コンポーネント] ウィンドウに表示されていることを確認します。これで ctlClockLib への参照が追加されます。
-
ツールボックス の [ctlClockLib コンポーネント] をクリックします。
-
ctlAlarmClock のアイコンが表示されるまで、下方にスクロールします。
-
[ctlAlarmClock] をダブルクリックして、[ctlAlarmClock] をフォームにコピーします。
-
ツールボックスで [DateTimePicker] を探してダブルクリックし、DateTimePicker コントロールをフォームに追加します。また、[Label] をダブルクリックし、Label コントロールを追加します。
-
マウスを使用して、フォーム上で各コントロールを使いやすい位置に移動します。
-
各コントロールのプロパティを次のように設定します。
|
コントロール
|
プロパティ
|
値
|
|
label1
|
Text
| (空白のまま) |
| |
Name
|
lblTest
|
|
dateTimePicker1
|
Name
|
dtpTest
|
| |
Format
|
Time
|
-
デザイナで [DateTimePicker] をダブルクリックします。
コード エディタが開き、private void dtpTest_ValueChanged が表示されます。
-
コードを次のように変更します。
// Visual J#
private void dtpTest_ValueChanged (Object sender, System.EventArgs e)
{
ctlAlarmClock1.set_AlarmTime(dtpTest.get_Value());
ctlAlarmClock1.set_AlarmSet(true);
lblTest.set_Text("Alarm Time is " + ctlAlarmClock1.get_AlarmTime().ToShortTimeString());
}
-
ソリューション エクスプローラで [Test2] を右クリックし、ショートカット メニューの [スタートアップ プロジェクトに設定] をクリックします。
-
[デバッグ] メニューの [開始] をクリックします。
テスト プログラムが起動します。ctlAlarmClock コントロールの現在時刻が更新され、DateTimePicker コントロールに開始時刻が表示されます。
-
DateTimePicker で分が表示されている部分をクリックします。
-
キーボードを使用して、ctlAlarmClock によって表示されている現在の時刻より 1 分後の値を設定します。
アラーム設定時刻は lblTest に表示されます。
-
表示時刻がアラームの設定時刻になるまで待ちます。
表示時刻がアラームの設定時刻になったときに、lblAlarm が点滅します。[Disable Alarm] をクリックしてアラームを切ります。ここでアラームをリセットできます。
このチュートリアルでは、多数の重要な概念を扱いました。ユーザー コントロール コンテナにコントロールやコンポーネントを組み込んでユーザー コントロールを作成する方法を学びました。また、コントロールにプロパティを追加する方法や、カスタム機能を実装するコードを記述する方法も学びました。2 番目のセクションでは、継承によって特定のユーザー コントロールの機能を拡張し、オーバーライドによりホストのメソッドの機能を変更する方法を学びました。
処理手順
チュートリアル : Visual J# での Windows フォーム コントロールの継承
その他の技術情報
コンポーネントによるプログラミング
コンポーネントおよびコントロール作成のチュートリアル