新規プロパティの実装
引き続き、前回のコードを改良していきましょう。
前回のコードでは影の色と深さを直接書いていました。これを、前景色などと同じように、プロパティで変更できるようにしたいですね。そこでまずは色と深さを保持するための変数を用意します。クラスの行頭に次のコードを追加してください。
private Color _shadowColor = SystemColors.GrayText; private int _shadowDepth = 1;
Private _shadowColor As Color = SystemColors.GrayText Private _shadowDepth As Integer = 1
それぞれの変数にはデフォルト値を設定します。そして、OnPaintの影を描画している部分を次のように、変数を使用するように変更します。
Brush brush = new SolidBrush(_shadowColor);
for (int i = 1; i <= _shadowDepth; i++)
{
pe.Graphics.DrawString(Text, Font, brush, i, i);
}
brush.Dispose();
Dim brush As Brush = New SolidBrush(_shadowColor)
For i As Integer = 1 To _shadowDepth
e.Graphics.DrawString(Text, Font, brush, i, i)
Next
brush.Dispose()
これで下準備はできました。いよいよプロパティのコードです。
public Color ShadowColor
{
get
{
return _shadowColor;
}
set
{
_shadowColor = value;
Invalidate();
}
}
public int ShadowDepth
{
get
{
return _shadowDepth;
}
set
{
_shadowDepth = value;
Invalidate();
}
}
Public Property ShadowColor() As Color
Get
Return _shadowColor
End Get
Set(value As Color)
_shadowColor = value
Invalidate()
End Set
End Property
Public Property ShadowDepth() As Integer
Get
Return _shadowDepth
End Get
Set(value As Integer)
_shadowDepth = value
Invalidate()
End Set
End Property
見慣れない構文が出てきたと思います。C#ではメソッドと区別するためにプロパティ名のあとに()が付きません。VB.NETではPropertyキーワードが付いています。getとsetはアクセサと呼ばれ、getはプロパティの値を取得する時に呼び出され、setは値を設定する時に呼び出されます。また、valueという特別な変数が使われています。この変数には、プロパティウィンドウやアプリケーションのコードなどで設定した値が入っています。
では、F6キーでコンパイルしてみましょう。プロパティウィンドウにShadowColorとShadowDepthが追加されましたね。それぞれの値を変更してみましょう。ちゃんと反映されましたね。このように、プロパティはその特殊な構文を覚えてしまえば、簡単に実装することができます。
せっかくなので、プロパティの書き方をもう少し掘り下げてみましょう。上のコードの場合、setでInvalidateが呼ばれています。そのような追加の処理が必要なく、次のような単純なプロパティを作りたいとします。
private int _someValue = 1;
public int SomeValue
{
get
{
return _someValue;
}
set
{
_someValue = value;
}
}
Private _someValue As Integer = 1
Public Property SomeValue() As Integer
Get
Return _someValue
End Get
Set(value As Integer)
_someValue = value
End Set
End Property
この場合、次のように省略した形でコードを書くことができます。
public int SomeValue { get; set; }
public SomeClass()
{
SomeValue = 1;
}
Public Property SomeValue As Integer = 1
C#の場合、初期値はコンストラクタで設定します。これは、プロパティの自動実装と呼ばれています。
次に、読み取り専用のプロパティの書き方を説明します。実はとても簡単です。
public int X { get; set; }
public int Y { get; set; }
public int Sum
{
get
{
return X + Y;
}
}
Public Property X() As Integer
Public Property Y() As Integer
Public ReadOnly Property Sum() As Integer
Get
Return X + Y
End Get
End Property
C#の場合は単にgetアクセサを書くだけです。VB.NETの場合はReadOnlyキーワードを付けます。書き込み専用のプロパティも作れます。C#の場合は単にsetアクセサを書くだけ、VB.NETの場合はWriteOnlyキーワードを付けます。
2014年1月2日