キーボードオペレーションの作成

独自のキーボードオペレーションクラスを作成することで、ユーザのキー ボードに対する動作をカスタマイズできます。例えば、フォーカスを指 定した順に遷移させるなどといったことが可能です。

キーボードオペレーションクラスは、以下のインターフェースを満たす 必要があります。

Public Interface IKeyboardOperation
    Function ProcessDialogKey(ByVal key As Keys, ByVal table As UTable) As Boolean
    Function EditorProcessDialogKey(ByVal key As Keys, ByVal table As UTable) As Boolean
    Sub LeaveEdit(ByVal direction As String, ByVal table As UTable)
End Interface

編集モードでないときの操作はProcessDialogKeyで定義します。編集モー ド時の操作は、EditorProcessDialogKeyで定義します。また、エディタ がLeaveイベントを発生させたときの操作は、LeaveEditで定義します。

デフォルトキーボードオペレーション

UTableはデフォルトでCDefaultKeyboardOperationクラスのインスタンス を保持します。特別な事情がない限り、キーボードオペレーションクラ スを自作する場合は、このクラスから継承してください。

CDefaultKeyboardOperationクラスがどのような処理を行うかについて説 明します。

ProcessDialogKey

前述のとおり、ProcessDialogKeyは編集モードでないときの操作につい て定義しています。

EditorProcessDialogKey

編集モード時のエディタ内でのキーボード操作について定義しています。

LeaveEdit

エディタがLeaveイベントを発生させた後に呼ばれます。引数として渡さ れたdirectionの値によって、以下のようにフォーカス移動します。

フォーカス移動用メソッド

これまでの説明で「次のフィールドへ移動」といったとき、それは具体 的には、現在の位置より右にフィールドがあればそこへ移動し、なけれ ば次の行の左端のフィールドへ移動するという意味です。この動作は、 nextメソッドに定義されています。このようにフォーカスを移動するた めのメソッドがCDefaultKeyboardOperationにはいくつか用意されていま す。これらのメソッドもオーバーライド可能です。

指定した順にフォーカス移動するキーボードオペレーション

レコード内で指定した順にフォーカスを移動させるキーボードオペレー ションを作成してみましょう。

    Class COrderKeyboardOperation
        Inherits CDefaultKeyboardOperation

        Public Order As List(Of Object)

        Public Sub New(ByVal order As List(Of Object))
            Me.Order = order
        End Sub

        Protected Overrides Sub [next](ByVal table As systembase.table.UTable)
            If table.FocusField IsNot Nothing Then
                Dim i As Integer = Me.Order.IndexOf(table.FocusField.Key)
                If i >= 0 Then
                    If i = Me.Order.Count - 1 Then
                        Dim r As UTable.CRecord = table.FocusField.Record.LayoutCache.NextRecord
                        If r IsNot Nothing Then
                            table.FocusField = r.Fields(Me.Order(0))
                            Exit Sub
                        End If
                    Else
                        table.FocusField = table.FocusField.Record.Fields(Me.Order(i + 1))
                        Exit Sub
                    End If
                End If
            End If
            MyBase.[next](table)
        End Sub
    End Class

これは、次のようにして利用します。

        Dim rp As New UTable.CRecordProvider
        With New CFieldBuilder
            rp.AddField(0, .Text("項目1"), .Next())
            rp.AddField(1, .Text("項目2"), .Next())
            rp.AddField(2, .Text("項目3"), .Next())
            rp.AddField(3, .Text("項目4"), .Next())
            rp.AddField(4, .Text("項目5"), .Next())
        End With

        Me.Table.Content.SetRecordProvider(rp)
        Me.Table.CreateCaption()

        Dim order As New List(Of Object)
        order.Add(0)
        order.Add(2)
        order.Add(4)
        Me.Table.KeyboardOperation = New COrderKeyboardOperation(order)

これで、項目1,項目3,項目5の順にフォーカス移動するようになります。

目次へ戻る