前のセクションでは、再利用可能なユーザー コントロールに 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 番目のセクションでは、継承によって特定のユーザー コントロールの機能を拡張し、オーバーライドによりホストのメソッドの機能を変更する方法を学びました。