RecordGridにて拡張したCellのフォーカスアウトイベントが複数回発生する

【ご質問】
レコードグリッドセルにて拡張したセルをフォーカスアウトすると
イベントが複数回発生してしまいます。
解決するにはどうしたらよいでしょう。

【回答】
RecordGridはさまざまなコントロールが複雑に絡み合って構成されております。
直接セル内のTextFieldに対してFocusIn、FocusOutのイベントを
設定しても意図した通りのイベントの発生となるとは限りません。

RecordGrid内でスクロールされた場合や、クリックされた場合、
再描画する必要がある場合などにrefresh-dataメソッドが呼ばれ、
その中でRecordGridCellが使い回しされ、RecordGridのセルに当てはめられていきます。
その際にそのセルの中で使われているTextFieldに
FocusIn、FocusOutのイベントが付いている場合、複数回のイベントが発生します。

このような状況でセル間のフォーカスが入った、出て行った事を通知する
RecordGridCell.note-grid-focus-in/RecordGridCell.note-grid-focus-out
メソッドが用意されています。
上記メソッドを使用することで実現することが可能かと思われます。

詳細は以下のサンプルをご参照ください。

{curl 6.0,7.0,8.0 applet}
{curl-file-attributes character-encoding = “shift-jis”}

{define-enum public Rank
    First,
    Second,
    Third
}

{let records:RecordSet =
    {RecordSet
        {RecordFields
            {RecordField
                “id”, caption = “User ID”, domain = int,
                index-type = RecordFieldIndexType.unique
            },
            {RecordField “Last”, domain = String},
            {RecordField “First”, domain = String},
            {RecordField “City”, domain = String}
        },
        {RecordData id = 1, Last = “Smith”, First = “Gene”, City = “Boston”},
        {RecordData id = 2, Last = “Smith”, First = “Fred”, City = “Cambridge”},
        {RecordData id = 3, Last = “Smith”, First = “Mike”, City = “Keene”},
        {RecordData id = 4, Last = “Smith”, First = “Ben”, City = “New Haven”},
        {RecordData id = 5, Last = “Abrams”, First = “Ben”, City = “Boston”},
        {RecordData id = 6, Last = “Jones”, First = “Sam”, City = “Storrs”},
        {RecordData id = 7, Last = “Stevens”, First = “Nigel”, City = “Hartford”},
        {RecordData id = 8, Last = “Stevens”, First = “Bert”, City = “Cambridge”},
        {RecordData id = 9, Last = “Linden”, First = “Pat”, City = “Hartford”},
        {RecordData id = 10, Last = “Abrams”, First = “Mat”, City = “Boston”}
    }
}
{define-class public TestCell {inherits StandardStringCell}
  {constructor public {default}
    {construct-super}
  }

  {method public {note-grid-focus-in}:void
    {super.note-grid-focus-in}
    {output “FocusIn “ & “self::[[“ & self & “]]”}
  }
  {method public {note-grid-focus-out}:void
    {super.note-grid-focus-out}
    {output “FocusOut “ & “self::[[“ & self & “]]”}
  } 
}

{let record-grid:RecordGrid =
    {RecordGrid
        record-source = records,
        height = 10cm,
        width = 13cm,
        {RecordGridColumn “id”, cell-spec = TestCell,edit-on-focus? = false},
        {RecordGridColumn “Last”},
        {RecordGridColumn “First”},
        {RecordGridColumn “City”},

        {on FocusIn do
            {output “FocusIn”}
        },
        {on event:FocusOut do
            {output “FocusOut”}
        }
    }
}

{View
    {Frame width = 13cm, height = 10cm,
        {VBox
            record-grid
        }
    },
    visibility = “normal”,
    {on WindowClose do
        {exit}
    }
}