ホーム | 機能紹介 | ドキュメント | ダウンロード |
カスタムエディタIEditorインターフェースを実装することで、独自のエディタを作成することができます。 作成したエディタは、フィールドプロバイダのCreateEditorメソッドで生成して返すことで、 そのフィールドの編集モード時に利用されるようになります。 IEditorインターフェースを満たすために、 実装すべきプロパティとメソッドを以下に示します。
さらに、IEditorには以下のイベントが実装されている必要があります。
テキストボックスエディタの実装参考のために、 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. |