Curl Global Community
Enterキーでのフォーカス遷移 - Printable Version

+- Curl Global Community (https://communities.curl.com)
+-- Forum: Discussions (https://communities.curl.com/forumdisplay.php?fid=1)
+--- Forum: General Curl questions (https://communities.curl.com/forumdisplay.php?fid=2)
+--- Thread: Enterキーでのフォーカス遷移 (/showthread.php?tid=168)



Enterキーでのフォーカス遷移 - umemura - 07-28-2011

テキストフィールドなどのコントロールは通常タブキーでフォーカス遷移しますが、

このフォーカス遷移をEnterキーで行うことはできないでしょうか。



RE: Enterキーでのフォーカス遷移 - umemura - 07-28-2011

Enterキーが押されたイベントは、UIオブジェクトのKeyPressイベントで取得できるので、

この中で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が出てしまいます。
理由は分かりません。



RE: Enterキーでのフォーカス遷移 - c-s - 07-29-2011

(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
を書き換えるしかないかもしれません。

そこまでしなくてもいい可能性があるけど、他の設定によるんでしょう。
残念ですが今の時点ではちょっと困難なところです。