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

カスタムエディタ

IEditorインターフェースを実装することで、独自のエディタを作成することができます。 作成したエディタは、フィールドプロバイダのCreateEditorメソッドで生成して返すことで、 そのフィールドの編集モード時に利用されるようになります。

IEditorインターフェースを満たすために、 実装すべきプロパティとメソッドを以下に示します。

プロパティまたはメソッド説明
Initialize(field) エディタの初期化時に呼ばれます
このメソッド内で、フォントやアライメントなどの設定を
フィールドの動的セッティングからエディタにコピーします
EditEnter(key) 編集モードに入る時に呼ばれます
keyには、ユーザが押下した文字キーが渡されます
EditLeave() 編集モードが終了する前に呼ばれます
Control() エディタのコントロールを返します
多くの場合、エディタ自身を返すことになります
Value エディタの値を設定・取得します

さらに、IEditorには以下のイベントが実装されている必要があります。

イベント説明
ValueChanged(sender) エディタの値が変更された時に発生させます
Leave(sender, direction) 編集モードを終了すべき時に発生させます
directionは、キーボードオペレーションのLeaveEditメソッドに渡されます

テキストボックスエディタの実装

参考のために、 CTextFieldProviderから利用されるテキストボックスエディタが、 どのように実装されているかを示します。

まず、標準のテキストボックス(TextBox)から継承し、IEditorを実装します。 クラス名はCTextBoxEditorとします。

    Public Class CTextBoxEditor
        Inherits TextBox
        Implements IEditor
    
        ...
    
    End Class

CTextFieldProviderのCreateEditorメソッドは、 このCTextBoxEditorクラスのオブジェクトを生成して返すようになっています。

    Public Class CTextFieldProvider
        Inherits CFieldProvider

        ...

        Public Overrides Function CreateEditor() As IEditor
            Return New CTextBoxEditor
        End Function

        ...

    End Class

それでは、CTextBoxEditorの各メソッド・プロパティ、そしてイベントの実装について説明していきましょう。

まず、Initializeメソッドの実装は以下のようになります。 フォントとアライメントをフィールドの動的セッティングから取得して設定します。

    Public Sub Initialize(ByVal field As UTable.CField) Implements IEditor.Initialize
        With field.DynamicSetting
            Me.Font = .Font
            Select Case .HorizontalAlignment
                Case UTable.EHAlign.LEFT
                    Me.TextAlign = HorizontalAlignment.Left
                Case UTable.EHAlign.MIDDLE
                    Me.TextAlign = HorizontalAlignment.Center
                Case UTable.EHAlign.RIGHT
                    Me.TextAlign = HorizontalAlignment.Right
            End Select
        End With
    End Sub  

EditEnterメソッドの実装は以下のようになります。 このメソッドは、エディタにフィールドの値が設定された後に呼ばれます。 UTableのSharedメソッドして定義されているImmAssociateContextメソッドで、 IMEのコンテキストをエディタに設定します。 また、編集モードに入る際に、ユーザが文字を入力したのであれば、 引数keyに渡されるので、それをエディタが持つ値の最初の文字として設定します。

    Public Sub EditEnter(ByVal key As Char, _
                         ByVal hIMC As Integer) Implements IEditor.EditEnter
        UTable.ImmAssociateContext(Me, hIMC)
        If key <> Nothing Then
            Me.Text = key
            Me.SelectionStart = 1
        End If
    End Sub  

EditLeaveメソッドの実装は以下のようになります。 このメソッドは、編集モードを抜ける前に呼ばれます。 テキストボックスエディタでは、このメソッドで行うべきことはありません。

    Public Sub EditLeave() Implements IEditor.EditLeave
    End Sub  

Controlメソッドの実装は以下のようになります。 このメソッドにより、エディタ自身をControlクラスのオブジェクトとして見せることができるようになり、 UTable側からサイズや位置、そしてフォーカスの制御を行えるようになります。

    Public Function Control() As System.Windows.Forms.Control Implements IEditor.Control
        Return Me
    End Function

Valueプロパティの実装は以下のようになります。

    Public Property Value() As Object Implements IEditor.Value
        Get
            Return Me.Text
        End Get
        Set(ByVal value As Object)
            Me.Text = value
        End Set
    End Property

ValueChangedイベントの実装は以下のようになります。 このイベントは、エディタの値が変更されるたびに発生するようにします。

    Public Event _ValueChanged(ByVal sender As Object) Implements IEditor.ValueChanged
    
    Private Sub CTextBoxEditor_TextChanged(ByVal sender As Object, _
                                           ByVal e As System.EventArgs) _
                                           Handles Me.TextChanged
        RaiseEvent _ValueChanged(Me)
    End Sub

Leaveイベントの実装は以下のようになります。 このイベントは、編集モードを終了すべき時に発生させます。 より具体的に説明すると、例えばテキストボックスエディタ内で上下キーが押された時に、 編集モードを抜けて上または下のフィールドへ移動する、 などといったことが、このイベントを発生させることで可能になります。 UTableはLeaveイベントを受け取ると、エディタのRaiseValidateイベントを呼びます。 これにより、(Validatingイベントでキャンセルされなければ)編集モードは終了されます。 その後、キーボードオペレーションのLeaveEditメソッドに引数directionが渡されて呼ばれます。 LeaveEditメソッドがdirection引数に何を受け取ることができるかについては、 こちらをご覧下さい

    Public Event _Leave(ByVal sender As Object, ByVal direction As String) _
                       Implements IEditor.Leave

    Protected Overrides Function IsInputKey(ByVal keyData As Keys) As Boolean
        Select Case keyData
            Case Keys.Escape
                RaiseEvent _Leave(Me, "ESC")
                Return True
            Case Keys.Up
                If Not Me.Multiline OrElse _
                   Me.SelectionStart <= (Me.Text & vbCr).IndexOf(vbCr) Then
                    RaiseEvent _Leave(Me, "UP")
                    Return True
                End If
            Case Keys.Down
                If Not Me.Multiline OrElse _
		   Me.SelectionStart >= (vbCr & Me.Text).LastIndexOf(vbCr) Then
                    RaiseEvent _Leave(Me, "DOWN")
                    Return True
                End If
            Case Keys.Left
                If Me.SelectionLength = 0 And Me.SelectionStart = 0 Then
                    RaiseEvent _Leave(Me, "LEFT")
                    Return True
                End If
            Case Keys.Right
                If Me.SelectionLength = 0 And Me.SelectionStart = Me.Text.Length Then
                    RaiseEvent _Leave(Me, "RIGHT")
                    Return True
                End If
            Case Keys.Enter
                If Not Me.Multiline Then
                    RaiseEvent _Leave(Me, "ENTER")
                    Return True
                End If
            Case (Keys.Enter Or Keys.Shift)
                If Not Me.Multiline Then
                    RaiseEvent _Leave(Me, "ENTER_PREV")
                    Return True
                End If
            Case Keys.Tab
                RaiseEvent _Leave(Me, "TAB")
                Return True
            Case (Keys.Tab Or Keys.Shift)
                RaiseEvent _Leave(Me, "TAB_PREV")
                Return True
        End Select
        Return MyBase.IsInputKey(keyData)
    End Function

サンプル 日付入力フィールド

サンプルとして、以下のフィールドを作成してみましょう。

エディタの実装は、以下のようになります。 DateTimePickerを継承し、IEditorを実装します。

    Class CDateEditor
        Inherits DateTimePicker
        Implements IEditor

        Public Event _Leave(ByVal sender As Object, ByVal direction As String) _
                           Implements IEditor.Leave
        Public Event _ValueChanged(ByVal sender As Object) _
                                   Implements IEditor.ValueChanged

        Public Sub New()
            Me.Format = DateTimePickerFormat.Custom
            Me.CustomFormat = "yyyy/MM/dd"
        End Sub

        Public Sub Initialize(ByVal field As UTableEx.CField) Implements IEditor.Initialize
            With field.DynamicSetting
                Me.Font = .Font
            End With
        End Sub

        Public Sub EditEnter(ByVal key As Char) Implements IEditor.EditEnter
        End Sub

        Public Sub EditLeave() Implements IEditor.EditLeave
        End Sub
    
        Private Sub CDateEditor_ValueChanged(ByVal sender As Object, _
                                             ByVal e As System.EventArgs) _
                                             Handles Me.ValueChanged
            RaiseEvent _ValueChanged(Me)
        End Sub

        Protected Overrides Function IsInputKey(ByVal keyData As Keys) As Boolean
            Select Case keyData
                Case Keys.Escape
                    RaiseEvent _Leave(Me, "ESC")
                    Return True
                Case Keys.Enter
                    RaiseEvent _Leave(Me, "ENTER")
                    Return True
                Case (Keys.Enter Or Keys.Shift)
                    RaiseEvent _Leave(Me, "ENTER_PREV")
                    Return True
                Case Keys.Tab
                    RaiseEvent _Leave(Me, "TAB")
                    Return True
                Case (Keys.Tab Or Keys.Shift)
                    RaiseEvent _Leave(Me, "TAB_PREV")
                    Return True
            End Select
            Return MyBase.IsInputKey(keyData)
        End Function

        Public Property _Value() As Object Implements IEditor.Value
            Get
                Return Me.Value
            End Get
            Set(ByVal value As Object)
                If TypeOf value Is Date Then
                    Me.Value = value
                End If
            End Set
        End Property

        Public Function Control() As Control Implements IEditor.Control
            Return Me
        End Function

    End Class

このエディタを利用するフィールドプロバイダの実装は、 以下のようになります。

    Class CDateFieldProvider
        Inherits CFieldProvider

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

        Public Overrides Function CreateEditor() As systembase.table.IEditor
            Return New CDateEditor
        End Function

        Protected Overrides Function formatValue(ByVal v As Object) As String
            If TypeOf v Is Date Then
                Return CType(v, Date).ToString("yyyy/MM/dd")
            Else
                Return ""
            End If
        End Function

    End Class

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


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