独自のキーボードオペレーションクラスを作成することで、ユーザのキー ボードに対する動作をカスタマイズできます。例えば、フォーカスを指 定した順に遷移させるなどといったことが可能です。
キーボードオペレーションクラスは、以下のインターフェースを満たす 必要があります。
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は編集モードでないときの操作につい て定義しています。
編集モード時のエディタ内でのキーボード操作について定義しています。
エディタが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の順にフォーカス移動するようになります。