Thread Rating:
  • 301 Vote(s) - 2.71 Average
  • 1
  • 2
  • 3
  • 4
  • 5
F2キーが効かない?
03-20-2014, 04:01 PM, (This post was last modified: 03-20-2014, 04:16 PM by umemura.)
#1
F2キーが効かない?
画面に対して「F2キー」が押されたら、ある処理を実行する、という機能を実装しているのですが、
レコードグリッドのセルにフォーカスがあるときにだけ、その処理が実行されない、という問題が起きています。

ヘルプを読んだところ、「レコードグリッド」ところに、F2キーを押して編集状態にする云々、という記述があり、
どうやら、セルにフォーカスが入った際に全選択の状態になるため、
F2キーを押すと、選択状態がクリアされ、カーソルが、セルの最後の位置に来る、という機能があるようです。

オープンコントロールを見たところ、SkinnedSRGTextFieldFeel という処理の中で、
セルの中で現在の選択状態を判断して、イベントをconsumeしているようなのですが、
セル内が空文字の場合、常にこの条件に当てはまってしまい、
常にF2キーの押下イベントが握りつぶされてしまうのようなのです。

カスタムセルのオーバーライドなら最低限の知識はあるのですが、
このルックアンドフィールの反映方法がよくわからず、
知っている方がいらっしゃったら教えてください。

Code:
{define-class public open CustomSkinnedSRGTextFieldFeel
  {inherits SkinnedSRGTextFieldFeel}

  {method public open {on-key-press ev:KeyPress}:void
    ||F2キーが押されても、セルに値がなければ無視
    {if-non-null ui = self.ui-object asa #SkinnableTextFieldUI then
        let constant rng:StringDataModelWritableRange =
            (ui.control asa TextField).selected-range
        {switch ev.value
         case KeyPressValue.f2 do
            {if 0 == rng.data-model.size then
                {return}
            }
        }
    }
    {super.on-key-press ev}
  }

}


{def rs =
    {RecordSet
        {RecordFields
            {RecordField "data1", default-value = ""},
            {RecordField "data2", default-value = "aaa"}
        },
        {RecordData}
    }
}

{let rg:RecordGrid =
    {RecordGrid
        record-source = rs
    }
}
{def vb = {VBox {TextField}, rg} }


{value vb}


{do
    ||F2 キーの押下イベント
    def handler =
        {on Action do
            {popup-message "F2 が押された"}
        }
    def key-accel = {KeyAccel key-accel-string = "F2", handler}
    def fm = {vb.get-focus-manager}
    {fm.add-key-accel key-accel}
}



{do
    || 上記でカスタマイズした セルのテキストフィールド用フィールをインストール
    || ※FIXME! この記述では正しく反映されていない
    def look-and-feel = {StyledLookAndFeel}
    {look-and-feel.register-control-feel SRGTextField, CustomSkinnedSRGTextFieldFeel}
    def style-sheet =
        {get-default-style-sheet}
    {install-style-sheet
            style-sheet,
            look-and-feel = look-and-feel
    }
}


03-23-2014, 07:37 PM, (This post was last modified: 03-23-2014, 07:40 PM by dyoshida.)
#2
RE: F2キーが効かない?
ご希望のルックアンドフィールの反映方法ではないのですが、
レコードグリッドのセルがフォーカスを持っている場合も、F2キーのキー アクセラレータラの方を
有効にするのであれば、RecordGridUI.reserved-key?をオーバーライドしてF2を追加する
というのはどうでしょうか?

適切でない感があるコードですが・・・
Code:
{define-class public open MyRecordGridUI {inherits SkinnableRecordGridUI}
  
  {method public open {reserved-key? ev:KeyPress}:bool
    {return
        {super.reserved-key? ev} or
        (ev.value == KeyPressValue.f2)
    }
  }
}

{define-class public open MyRecordGrid {inherits RecordGrid}
  {constructor {default ...}
    {construct-super
        {splice ...},
        ui-object = {MyRecordGridUI}
    }
  }
}

{def rs =
    {RecordSet
        {RecordFields
            {RecordField "data1", default-value = ""},
            {RecordField "data2", default-value = "aaa"}
        },
        {RecordData}
    }
}

{let rg:MyRecordGrid =
    {MyRecordGrid
        record-source = rs
    }
}
{def vb = {VBox {TextField}, rg} }


{value vb}


{do
    ||F2 キーの押下イベント
    def handler =
        {on Action do
            {popup-message "F2 が押された"}
        }
    def key-accel = {KeyAccel key-accel-string = "F2", handler}
    def fm = {vb.get-focus-manager}
    {fm.add-key-accel key-accel}
}
03-24-2014, 09:58 AM,
#3
RE: F2キーが効かない?
dyoshida さん、返信ありがとうございます。

RecordGridUI.reserved-key? というものがあるのですね。

F2キーには、セルへのフォーカス遷移時に選択された文字の選択状態をはずす、
という機能があるようなので、その機能は生かすようにするため、
下記のようなコードにしてみます。

ありがとうございました。

Code:
{define-class public open MyRecordGridUI {inherits SkinnableRecordGridUI}

  {method public open {reserved-key? ev:KeyPress}:bool
    {return {super.reserved-key? ev} or {self.check-f2-event ev}}
  }

  {method public open {check-f2-event ev:KeyPress}:bool
    {type-switch self.grid-focus
     case str-cell:StandardStringCell  do
        def editor = str-cell.current-editor
        ||F2キーが押されても、セルに値がなければ無視
        {if-non-null ui = editor.ui-object asa #SkinnableTextFieldUI then
            let constant rng:StringDataModelWritableRange =
                (ui.control asa TextField).selected-range
            {switch ev.value
             case KeyPressValue.f2 do
                {if 0 == rng.data-model.size then
                    {return true}
                }
            }
        }
    }
    {return false}
  }
}

ルックアンドフィールドの反映方法も後学として知っておきたいので、
もしご存知のかたがいらっしゃったら教えてください。

03-27-2014, 02:57 PM,
#4
RE: F2キーが効かない?
素早く複数のセルへ連続入力すると、エラーになってしまったので、少し修正。
Code:
{method public open {check-f2-event ev:KeyPress}:bool
    {type-switch self.grid-focus
    case str-cell:StandardStringCell  do
        def editor = str-cell.current-editor
        ||F2キーが押されても、セルに値がなければ無視
        {if-non-null editor then
            {type-switch  editor.ui-object
             case tf-ui:SkinnableTextFieldUI  do
                let constant rng:StringDataModelWritableRange =
                    (tf-ui.control asa TextField).selected-range
                {switch ev.value
                 case KeyPressValue.f2 do
                    {if 0 == rng.data-model.size then
                        {return true}
                    }
                }
            }
        }
    }
    {return false}
  }

Forum Jump:


Users browsing this thread:
1 Guest(s)

MyBB SQL Error

MyBB has experienced an internal SQL error and cannot continue.

SQL Error:
1017 - Can't find file: 'mybb_threadviews' (errno: 2)
Query:
INSERT INTO mybb_threadviews (tid) VALUES('1057')