新規プロパティの実装

カスタムコントロール作成入門講座初級編

引き続き、前回のコードを改良していきましょう。

前回のコードでは影の色と深さを直接書いていました。これを、前景色などと同じように、プロパティで変更できるようにしたいですね。そこでまずは色と深さを保持するための変数を用意します。クラスの行頭に次のコードを追加してください。

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キーワードを付けます。

« »

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

« »