PowerTools SPREAD for Windows Forms 10.0J > 開発者ガイド > キーボード操作 > キーボードマップに関する要素 |
次の要素は、キー入力の処理に影響をおよぼします。キー入力の既定のアクションを変更する場合も、新しいキーにアクションを割り当てる場合も、これらの要素について理解する必要があります。
キー入力の割り当ては、フォーカス位置と操作モードによって決まります。たとえば[Enter]キー、フォーカスがセルのエディタにあるのか、コントロールにあるかによって、実行されるアクションが異なります。セルのエディタにフォーカスがある場合(セルが編集状態の場合)、[Enter]キーはセルの編集状態を終了します。一方、コントロールにフォーカスがある場合、[Enter]キーは、アクティブセルで編集を開始します。
操作モードに関しては、たとえば読み取り専用モード(ReadOnly)には、アクティブセルが存在しません。したがって、アクティブセルの移動に、キーは割り当てられていません。
既定の入力マップをカスタマイズするときには、フォーカス位置と操作モードに注意する必要があります。入力マップは辞書のようなもので、それぞれのキー入力に対して、1つの意味(アクション)を定義しています。異なる言語に異なる辞書が必要であるように、フォーカス位置、および各操作モードに対応した、異なる入力マップが必要です。
コントロールには、フォーカス位置に対応したWhenFocused、およびWhenAncestorOfFocusedという2つの入力マップがあります。WhenFocusedで指定する入力マップには、コントロール(子コントロールではない)にフォーカスがあるときに適用されるキー入力の割り当てが保持されます。 WhenFocused入力マップにエントリを追加することは、IsInputKeyおよびIsInputCharメソッド(キーボード操作に対してTrueを返すメソッド)、およびOnKeyDown、OnKeyPress、OnKeyUpメソッド(キーボード操作を処理するメソッド)の上書きと同じです。WhenAncestorOfFocusedで指定する入力マップには、コントロール、または子コントロールにフォーカスがあるときに適用されるキー入力の割り当てが保持されます。WhenAncestorOfFocused入力マップにエントリを追加することは、ProcessDialogKeyおよびProcessDialogCharメソッド(キーボード操作を処理するメソッド)の上書きと同じです。この入力マップに、機能をより正確に表す名前を付けるとすれば、WhenAncestorOfFocusedというよりWhenFocusedOrAncestorOfFocusedとなるべきところです。
キー入力を処理する最初の要素は、何が(どのコントロールが)キー入力(またはキー入力の組み合わせ)を受け取ったかです。.NETでは、キー入力は前処理と通常処理の2段階で行われます。製品では、ほとんどのキー入力が前処理で行われ、これは、WhenAncestorOfFocused入力マップに対応付けられます。前処理では、キー入力は、IsInputKey、IsInputChar、ProcessDialogKey、およびProcessDialogCharメソッドによって処理されます。通常処理は、WhenFocused入力マップに対応付けられます。通常処理では、キー入力は、OnKeyDown、OnKeyPress、およびOnKeyUpメソッドによって処理され、それぞれKeyDown、KeyPress、およびKeyUpイベントを発生させます。
概して、製品で発生するユーザー操作のほとんどは、WhenAncestorOfFocused入力マップの一部です。アクティブセルの移動、セルの範囲選択などは、WhenAncestorOfFocused入力マップの一部です。たとえば、[Tab]キーは、セルが編集状態(セルのエディタにフォーカスがある状態)であっても、非編集状態(コントロールにフォーカスがある状態)であってもアクティブセルを移動します。一方、セルが非編集状態(コントロールにはフォーカスがある状態)でしか割り当てられないキーもあります。たとえば、セルが編集状態の場合に等号キー(=)を押しても、アクションは実行されませんが、非編集状態の場合に等号キーを押すと、アクティブセルで数式の編集が開始されます。
コントロールには、親となるグローバルな入力マップがあります。これは、プロジェクト内のすべてのFpSpreadコントロールによって共有されます。あるコントロールの入力マップをカスタマイズするには、対象のコントロールのローカル入力マップをカスタマイズすることになります。
グローバル入力マップを使用すると、1つの入力マップを共有することで、コントロールで使用するメモリ量を節約できます。ローカル入力マップを使用すると既定の設定をカスタマイズできます、そして、カスタマイズした設定を後でクリアし「既定の入力マップ」で示す既定の設定に戻すことができます。
入力マップを処理する際には、グローバル入力マップに対して実行されるメソッドと、ローカル入力マップに対して実行されるメソッドを認識しておく必要があります。入力マップを返すためのInputMapクラスのGetメソッドは、グローバルおよびローカルのすべての入力マップを検索します。Put、Remove、およびClearメソッドは、ローカル入力マップに対してのみ実行されます。たとえば、Removeメソッドを呼び出すと、ローカルマップのカスタム設定だけが削除され、グローバル入力マップの既定の設定は変更されません。
グローバル入力マップ自体は変更できませんが、変更の必要がある場合は、新規の入力マップを作成し、この入力マップを既定の入力マップの代わりにグローバル入力マップとして割り当てます。
コントロールは、ワークブックを表す1つ、または複数のSpreadViewインスタンスを保持します。階層表示を設定している場合、親はSpreadViewクラスの1つのインスタンスであり、子もそれぞれSpreadViewクラスのインスタンスとなります。個々のSpreadViewインスタンスは、それぞれ入力マップを保持します。親のSpreadViewインスタンスの入力マップで設定したキー入力の割り当ては、子のSpreadViewインスタンスには影響を与えません。これを利用して、階層ごとに異なるキー入力の割り当てを設定することもできます。また、特定のキー入力の割り当てを階層内の全レベルに適用するには、親、およびすべての子の入力マップを変更する必要があります。
既定では、キー入力のほとんどは、WhenAncestorOfFocused入力マップ内にのみ割り当てをもちます。したがって、既定の処理をカスタマイズするときに上書きする割り当ては、1つのみです。ただし、[Enter]キーは例外です。WhenAncestorOfFocused入力マップでは、[Enter]キーは、SpreadActionsクラスのStopEditingフィールド(編集終了アクション)に割り当てられています。そして、WhenFocused入力マップでは、StartEditing(編集開始アクション)に割り当てられています。したがって、[Enter]キーの処理をカスタマイズするには、この2つの割り当てを上書きする必要があります。
次のサンプルコードは、[Enter]キーの既定の割り当てをカスタマイズし、セルの編集状態に関わらずアクティブセルを次の行に移動するようにします。
C# |
コードのコピー
|
---|---|
FarPoint.Win.Spread.InputMap whenAncestorOfFocusedMap = fpSpread1.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenAncestorOfFocused); FarPoint.Win.Spread.InputMap whenFocusedMap = fpSpread1.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenFocused); whenAncestorOfFocusedMap.Put(new FarPoint.Win.Spread.Keystroke(Keys.Enter, Keys.None), FarPoint.Win.Spread.SpreadActions.MoveToNextRow); whenFocusedMap.Put(new FarPoint.Win.Spread.Keystroke(Keys.Enter, Keys.None), FarPoint.Win.Spread.SpreadActions.MoveToNextRow); |
Visual Basic |
コードのコピー
|
---|---|
Dim whenAncestorOfFocusedMap As FarPoint.Win.Spread.InputMap = FpSpread1.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenAncestorOfFocused) Dim whenFocusedMap As FarPoint.Win.Spread.InputMap = FpSpread1.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenFocused) whenAncestorOfFocusedMap.Put(New FarPoint.Win.Spread.Keystroke(Keys.Enter, Keys.None), FarPoint.Win.Spread.SpreadActions.MoveToNextRow) whenFocusedMap.Put(New FarPoint.Win.Spread.Keystroke(Keys.Enter, Keys.None), FarPoint.Win.Spread.SpreadActions.MoveToNextRow) |
SpreadActionsクラスのNoneアクションは、キーボード操作が入力マップによって処理されていないことを示す特殊なアクションです。
「None」アクションを入力マップに追加することは、入力マップに対してInputMapオブジェクトのRemoveメソッドを呼び出す場合と似ています。違いは、「None」アクションは、グローバル入力マップの割り当てを上書きできるのに対し、Removeメソッドは対象のコントロールのローカル入力マップの割り当てにのみ適用されることです。既定では、WhenFocused、およびWhenAncestorOfFocused入力マップは、ローカル入力マップに直接の割り当てをもたず、グローバル入力マップの割り当てを間接的に保持します。したがって、WhenFocused、およびWhenAncestorOfFocused入力マップで割り当てられている既定の処理を無効化したい場合は、Putメソッドで「None」アクションを割り当てます。
次のサンプルコードは、[Enter]キーの既定の割り当てを無効化します。ユーザーが[Enter]キーを押しても、何も行われません。
C# |
コードのコピー
|
---|---|
FarPoint.Win.Spread.InputMap whenAncestorOfFocusedMap = fpSpread1.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenAncestorOfFocused); FarPoint.Win.Spread.InputMap whenFocusedMap = fpSpread1.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenFocused); whenAncestorOfFocusedMap.Put(new FarPoint.Win.Spread.Keystroke(Keys.Enter, Keys.None), FarPoint.Win.Spread.SpreadActions.None); whenFocusedMap.Put(new FarPoint.Win.Spread.Keystroke(Keys.Enter, Keys.None), FarPoint.Win.Spread.SpreadActions.None); |
Visual Basic |
コードのコピー
|
---|---|
Dim whenAncestorOfFocusedMap As FarPoint.Win.Spread.InputMap = FpSpread1.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenAncestorOfFocused) Dim whenFocusedMap As FarPoint.Win.Spread.InputMap = FpSpread1.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenFocused) whenAncestorOfFocusedMap.Put(New FarPoint.Win.Spread.Keystroke(Keys.Enter, Keys.None), FarPoint.Win.Spread.SpreadActions.None) whenFocusedMap.Put(New FarPoint.Win.Spread.Keystroke(Keys.Enter, Keys.None), FarPoint.Win.Spread.SpreadActions.None) |
グローバルのWhenFocused入力マップには、[Esc]キーに対する割り当ては含まれていません。 |