UTable .NET Framework用 表入力コンポーネント
ドキュメント

カスタムフィールド

この項では、独自のフィールドプロバイダを作成する方法について説明します。 フィールドプロバイダを作成することで、独自の形式のフィールドを利用することができるようになります。

CFieldProviderクラス

フィールドプロバイダはIFieldProviderインターフェースを実装することで作成できます。 ただし、通常は代表的な実装クラスであるCFieldProviderクラスを継承して作成してください。 CFieldProviderクラスには、サブクラスから利用されることを想定した有用なメソッドがいくつか含まれています。

CFieldProviderクラスの重要なメソッドを以下に示します。 これらのメソッドは全てオーバーライド可能です。

メソッド説明
CreateField() フィールドを生成して返します
FieldInitialize(field) フィールドの初期化を行います
フィールドが生成された直後に呼ばれます
CreateEditor() エディタを生成して返します
Nothingを返すと、編集不可のフィールドとなります
EditorInitialize(field, editor) エディタの初期化を行います
エディタが生成された直後に呼ばれます
Setting() 必要ならばセッティングを生成して返します
このメソッドが返したセッティングは、フィールドディスクリプタに設定されます
Focusable() フィールドがフォーカスを得ることができるかを返します
ImeMode() IMEモードを返します
RenderOrder() フィールドが描画される順を返します
デフォルトでは0を返します
CCaptionFieldProviderでは1を返すようになっています
このメソッドは0か1のどちらかの値を返さなければいけません
Render(g, field, rect, alter) フィールドを描画します
valueFormat(value) フィールドの値を表示形式にフォーマットして返します
このメソッドはRenderメソッドから利用されます
GetAdjustSize(g, field) アジャストされるサイズを返します

フィールドプロバイダには他に、以下のプロパティを持ちます。

プロパティ説明
Caption 見出し文字列を設定・取得します
この値はテーブルのCreateCaptionメソッドから利用されます
このプロパティはオーバーライドできません
TabOrder フィールドのフォーカス移動順を設定・取得します
このプロパティはオーバーライドできません
Clipboard(field) クリップボードへのコピーおよびペーストを行う際の
フィールドに対する値の読み書きを行います
このプロパティはオーバーライド可能です

サンプル 数値のカンマ編集

以下のようなフィールドを生成してみましょう。

水平方向アライメントを右寄せとし、フィールドの値をカンマ編集して表示します。

フィールドプロバイダの定義は以下のようになります。 アライメントの制御はSettingで行います。 また、カンマ編集はformatValueメソッドで行います。

  Class CCammaFieldProvider
    Inherits CFieldProvider

    'Captionをコンストラクタに渡せるようにする
    Public Sub New(ByVal caption As String)
        MyBase.New(caption)
    End Sub

    Protected Overrides Function formatValue(ByVal v As Object) As String
        Return Format(v, "#,###")
    End Function

    Public Overrides Function Setting() As UTable.CSetting
        Dim s As New UTable.CSetting
        s.HorizontalAlignment = UTable.EHAlign.RIGHT
        Return s
    End Function

 End Class

フィールドの描画

フィールドの描画はRenderメソッドで行われます。 このメソッドをオーバーライドすることで、フィールドの外観を自由に制御することができるようになります。 Renderメソッドからは以下のメソッドが呼ばれます。 これらのメソッドはオーバーライド可能です。

メソッド説明
renderBackground(g, field, s, rect, alter) フィールドの背景と境界線を描画します
renderForeGround(g, field, s, rect, alter) フィールドの値を描画します

引数の意味はそれぞれ、gはグラフィクスオブジェクト、fieldは対象のフィールド、 sはフィールドの動的セッティング、rectはフィールドを描画すべき矩形、 alterはレコードのインデックスが奇数かどうかのブール値です。

フィールドの描画を制御する場合は、できるだけRenderメソッドを直接オーバーライドするのではなく、 これらのメソッドをオーバーライドしてください。 Renderメソッドをオーバーライドするならば、デコレータの制御なども自前で行わなければならなくなります。

renderBackgound、renderForegroundからは、以下のメソッドが呼ばれます。 これらのメソッドは全てsharedです。

メソッド説明
BackColor(field, setting, alter) フィールドの背景色を返します
そのフィールドがフォーカスを得ているか否かや、
偶数レコードなのか奇数レコードなのかなどの条件によって、
動的に背景色を決定して返します
ForeColor(field, setting, alter) フィールドの前景色を返します
そのフィールドがフォーカスを得ているか否かなどの条件によって、
動的に前景色を決定して返します
CaptionBackColor(field, setting, drag) 見出しフィールドの背景色を返します
CaptionForeColor(field, setting, drag) 見出しフィールドの前景色を返します
RenderBackgroudRect(g, field, rect, color) フィールドの背景の矩形を描画します
RenderBorder(g, rect, borderLine, color, style) フィールドの境界線を描画します
RenderValue(g, rect, formattedValue,
         color, font, stringFormat)
フィールドの値を描画します
RenderCaptionBackgroudRect(g, rect, color, style) 見出しフィールドの背景の矩形を描画します
RenderCaptionBorder(g, rect, borderLine, color) 見出しフィールドの境界線を描画します
RenderCaptionValue(g, field, sortState, rect,
         formattedValue, color, font, stringFormat)
見出しフィールドの値を描画します
RenderCheckBox(g, rect, value) チェックボックスを描画します
RenderNarrowChild(g, rect, value) ナローイングボックスを描画します

参考のために、renderBackgroundメソッドのデフォルトの実装を以下に示します。

    Protected Overridable Sub renderBackground(ByVal g As Graphics, _
                                               ByVal field As UTable.CField, _
                                               ByVal s As UTable.CDynamicSetting, _
                                               ByVal rect As Rectangle, _
                                               ByVal alter As Boolean)
        RenderBackgroudRect(g, rect, BackColor(field, s, alter))
        RenderBorder(g, rect, Me.BorderLine, _
                     field.Table.Setting.BorderColor, _
                     field.Table.Setting.BorderStyle)
    End Sub  

デフォルトのrenderForegoundの実装も以下に示します。

    Protected Overridable Sub renderForeGround(ByVal g As Graphics, _
                                               ByVal field As UTable.CField, _
                                               ByVal s As UTable.CDynamicSetting, _
                                               ByVal rect As Rectangle, _
                                               ByVal alter As Boolean)
        If field.Editor Is Nothing Then
            RenderValue(g, rect, Me.formatValue(field.Value), _
                        ForeColor(field, s, alter), s.Font, s.GetStringFormat)
        End If
    End Sub

サンプル グラフ表示

以下のようなフィールドを生成してみましょう。

renderForeGroundメソッドをオーバーライドし、グラフが描画されるようにします。 また、アジャストを行ったときに、グラフがちょうど収まるサイズに調整されるようにします。

フィールドプロバイダの定義は以下のようになります。 Renderメソッドをオーバーライドし、RenderValueを呼ぶ代わりに、グラフの矩形を描画します。 また、GetAdjustSizeをオーバーライドし、アジャストのサイズを返します。

    Class CGraphFieldProvider
        Inherits CFieldProvider

        Public Sub New(ByVal caption As String)
            MyBase.New(caption)
        End Sub

        Protected Overrides Sub renderForeGround(ByVal g As Graphics, _
                                                 ByVal field As UTable.CField, _
                                                 ByVal s As UTable.CDynamicSetting, _
                                                 ByVal rect As Rectangle, _
                                                 ByVal alter As Boolean)
            g.SetClip(rect)
            Dim l As Integer = field.Value * 10
            If l > 0 Then
                Using b As New SolidBrush(Color.SteelBlue)
                    g.FillRectangle(b, New Rectangle(rect.X, rect.Y + 5, l, rect.Height - 10))
                End Using
            End If
            g.ResetClip()
        End Sub
    
        Public Overrides Function GetAdjustSize(ByVal g As System.Drawing.Graphics, _
                                                ByVal field As systembase.table.UTable.CField) _
                                                As System.Drawing.Size
            Return New Size(field.Value * 10, field.Table.DefaultGridSize.Row)
        End Function

    End Class    

次へ    ドキュメントのトップ / ホーム


Copyright (c) 2009, SystemBase Co.,Ltd.
All rights reserved.