Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
StandardStringCell.create-editor では、self を使わないこと
03-24-2014, 01:55 PM, (This post was last modified: 03-24-2014, 01:56 PM by umemura.)
#1
StandardStringCell.create-editor では、self を使わないこと
★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 でも同様です。
Reply

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('1058')