RecordGridの特定行に対する制御

【ご質問】
RecordGridのある行のテキスト色・背景色を変更した場合に、
スクロールバーを上下させると、異なる行の色が変わってしまいます。
どのようにすれば特定行のみ変更されるのでしょうか。

【回答】
APIリファレンスの[CURL.GUI.CONTROL-LOGICAL]-[RecordGridUI]
の項内のメソッド[get-cell-at-index]の項にも記述されていますように、
セルは使い回しが行われます。

そのため、特定行のセルを変化させたつもりでも、セルが使い回されるため
何か操作した際(スクロールバーの移動等)に別のデータを表示することとなり、
別のデータの色が変化してしまうことがあります。

カスタムセルを使用することで、今回の現象を解決することができます。
詳細は以下のサンプルをご参照ください。

{curl 6.0,7.0,8.0 applet}
{curl-file-attributes character-encoding = “shift-jis”}
{applet
    {compiler-directives careful? = true}
}

{define-class public ControlCell {inherits StandardStringCell}

  {constructor public {default}
    {construct-super}
  }
  {method public open {refresh-data}:void
    {unset self.background}
    {unset self.color}

    {if rec == self.record then
        set self.background = “red”
        set self.color = “blue”
     else
    }
   
    {super.refresh-data}
  }
}

{let data:RecordSet =
    {RecordSet
        {RecordFields
            {RecordField “DATA01”, domain = String},
            {RecordField “DATA02”, domain =String},
            {RecordField “DATA03”, domain = String}
        },
        {RecordData DATA01 = “1”, DATA02 = “2”,DATA03 = “3”},
        {RecordData DATA01 = “1”, DATA02 = “2”,DATA03 = “3”},
        {RecordData DATA01 = “1”, DATA02 = “2”,DATA03 = “3”},
        {RecordData DATA01 = “1”, DATA02 = “2”,DATA03 = “3”},
        {RecordData DATA01 = “1”, DATA02 = “2”,DATA03 = “3”},
        {RecordData DATA01 = “1”, DATA02 = “2”,DATA03 = “3”},
        {RecordData DATA01 = “1”, DATA02 = “2”,DATA03 = “3”},
        {RecordData DATA01 = “1”, DATA02 = “2”,DATA03 = “3”},
        {RecordData DATA01 = “1”, DATA02 = “2”,DATA03 = “3”},
        {RecordData DATA01 = “1”, DATA02 = “2”,DATA03 = “3”}
    }
}

{let grid:RecordGrid =
    {RecordGrid
        width = 286pt,
        height = 80pt,
        record-source =data,
        {RecordGridColumn “DATA01”, cell-spec = ControlCell, edit-on-focus? = false},
        {RecordGridColumn “DATA02”, cell-spec = ControlCell, edit-on-focus? = false},
        {RecordGridColumn “DATA03”, cell-spec = ControlCell, edit-on-focus? = false}
    }
}

{let no:int = 1}
{let rec:#Record}

|| 色変更ボタン
{let btn:CommandButton =
    {CommandButton
        width = 100pt,
        height = 50pt,
        label = “2行目の色を変更する”,
        {on e:Action do
            {set rec = grid.records[no]}
            {grid.records.load}
        }
    }
}

{View
    {VBox
        grid,
        btn
    },
    visibility = “normal”,
    {on WindowClose do
        {exit}
    }
}

また、Curl開発者ガイドの
[データの管理と表示]-[データ レコードとグリッド]-[カスタム セルの作成]
の項をご参照ください。