| ホーム | 機能紹介 | ドキュメント | ダウンロード |
カスタムエディタ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. |