Curl Global Community
StandardStringCell.create-editor では、self を使わないこと - Printable Version

+- Curl Global Community (https://communities.curl.com)
+-- Forum: Blogs (https://communities.curl.com/forumdisplay.php?fid=17)
+--- Forum: Tech blog (https://communities.curl.com/forumdisplay.php?fid=18)
+---- Forum: Baison log (https://communities.curl.com/forumdisplay.php?fid=27)
+---- Thread: StandardStringCell.create-editor では、self を使わないこと (/showthread.php?tid=1058)



StandardStringCell.create-editor では、self を使わないこと - umemura - 03-24-2014

★point
 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 でも同様です。