03-24-2014, 01:55 PM
★point
StandardStringCell.create-editor で自分自身(StandardStringCell)のインスタンスを取得するには、
get-grid-cell プロシージャを利用すること
たとえば、セルにフォーカスが入ったら、そのセルを強調表示するために、
背景色をつけたい、と思って、
下記のような記述をしても、うまくいきません。
原因は、StandardStringCell.create-editor の中で、セルのインスタンスを取得している方法が self だから。
create-editor は、そのカラムのなかの、いずれかのセルにファーカスが入るなどして、
最初に要求されたときだけ呼ばれるメソッドなので、
このメソッドのなかでself を利用してしまうと、最初のセルにポインタが張られてしまい、
プログラマが意図する、「フォーカスが入ったセル」ではなくなってしまいます。
意図した振舞いをさせるには、下記のように、get-grid-cell を利用して、
毎回セルを再取得すると良いようです。
また、この方法は、StandardDropdownCell でも同様です。
StandardStringCell.create-editor で自分自身(StandardStringCell)のインスタンスを取得するには、
get-grid-cell プロシージャを利用すること
たとえば、セルにフォーカスが入ったら、そのセルを強調表示するために、
背景色をつけたい、と思って、
下記のような記述をしても、うまくいきません。
Code:
{define-class public open CustomStringCell {inherits StandardStringCell }
{method protected open {create-editor}:TextField
def editor = {super.create-editor}
{editor.add-event-handler
{on e:FocusIn do
set self.background = "aqua"
}
}
{editor.add-event-handler
{on e:FocusIn do
{unset self.background}
}
}
{return editor}
}
}
{def rs =
{RecordSet
{RecordFields {RecordField "data"}},
{RecordData data = ""},
{RecordData data = ""},
{RecordData data = ""},
{RecordData data = ""}
}
}
{let rg:RecordGrid =
{RecordGrid
record-source = rs,
{RecordGridColumn width = 3in, "data", cell-spec = CustomStringCell}
}
}
{value rg}
原因は、StandardStringCell.create-editor の中で、セルのインスタンスを取得している方法が self だから。
create-editor は、そのカラムのなかの、いずれかのセルにファーカスが入るなどして、
最初に要求されたときだけ呼ばれるメソッドなので、
このメソッドのなかでself を利用してしまうと、最初のセルにポインタが張られてしまい、
プログラマが意図する、「フォーカスが入ったセル」ではなくなってしまいます。
意図した振舞いをさせるには、下記のように、get-grid-cell を利用して、
毎回セルを再取得すると良いようです。
Code:
{define-class public open CustomStringCell {inherits StandardStringCell }
{method protected open {create-editor}:TextField
def editor = {super.create-editor}
{editor.add-event-handler
{on e:FocusIn at tf:TextField do
{if-non-null cell = {get-grid-cell tf} then
set cell.background = "aqua"
}
}
}
{editor.add-event-handler
{on e:FocusOut at tf:TextField do
{if-non-null cell = {get-grid-cell tf} then
{unset cell.background}
}
}
}
{return editor}
}
}
また、この方法は、StandardDropdownCell でも同様です。