07-28-2011, 05:08 PM
07-28-2011, 05:13 PM
Enterキーが押されたイベントは、UIオブジェクトのKeyPressイベントで取得できるので、
この中でTabキーのイベントに変換して流してやればいけそうです。
下記のコードはレコードグリッドのカスタムセルのサンプルです。
cell-spec に設定すると、グリッド内のセルがエンターキーで遷移します。
ちなみに、キープレスのイベントをenuqueue-event で発生させていますが、
handle-event だと、NullDereferenceExceptionが出てしまいます。
理由は分かりません。
この中でTabキーのイベントに変換して流してやればいけそうです。
下記のコードはレコードグリッドのカスタムセルのサンプルです。
cell-spec に設定すると、グリッド内のセルがエンターキーで遷移します。
Code:
{define-class public EnterMoveCell {inherits StandardStringCell}
{constructor public {default}
{construct-super}
}
{method public {create-editor}:TextField
let editor:TextField = {super.create-editor}
{editor.ui-object.add-event-handler
{on e:KeyPress do
{if e.value == KeyPressValue.enter
then
let kp:KeyPress = {KeyPress}
set kp.value = KeyPressValue.tab
set kp.shifty? = e.shift?
{editor.ui-object.enqueue-event
kp
}
{e.consume}
}
}
}
{return editor}
}
}
ちなみに、キープレスのイベントをenuqueue-event で発生させていますが、
handle-event だと、NullDereferenceExceptionが出てしまいます。
理由は分かりません。
07-29-2011, 01:53 PM
(07-28-2011, 05:13 PM)umemura Wrote: [ -> ]ちなみに、キープレスのイベントをenuqueue-event で発生させていますが、
handle-event だと、NullDereferenceExceptionが出てしまいます。
理由は分かりません。
handle-eventを使えば、直接フォーカスが変わって、
Enterの残っているハンドリングがおかしくなります。
上の書いている方法は少し危険です、下の様に、イベントの流れがあれば。
[queue] enter -> 'a'
ユーザーは(移動)、('a'の入力)を期待しているでしょう。
ですが、enqueueすれば、こうなります。
[queue] enter -> 'a' -> tab
'a'が最初セルに入ってしまいます。
安全方法には、OpenControlsを使って、
SkinnableRecordGridUI.on-key-press-aux
と
SkinnedSRGTextFieldFeel.on-key-press
を書き換えるしかないかもしれません。
そこまでしなくてもいい可能性があるけど、他の設定によるんでしょう。
残念ですが今の時点ではちょっと困難なところです。