私の考え違いでした。メモリ解放されました。
下記のサンプルで試していたのですが、
ポイントは、グリッドに渡したカラムの配列をクリアする、ということのようです。
前のサンプルで、カラムの配列を明示的にクリアしていなくても、
getterの場合にはメモリが解放されていたのは、
RecordGrid.columns に新しいカラムの配列が設定された時点で、
古いカラムの配列がガベージとして判断されたから、ということかもしれません。
field で定義してしまうと、うかつにクリアできないですし、
やはり、RecordGridColumn の配列は、
getter を利用して一時変数で作成する、というのが、
セルのインスタンスをガベージとして認識させるには正しいようです。
Code:
{def columns-tf = {TextField value = "30"}}
{def records-tf = {TextField value = "1000"}}
{HBox "カラム数", columns-tf}
{HBox "レコード数", records-tf}
{let grid:#RecordGrid = null}
{def col-ary = {{Array-of RecordGridColumn}}}
{let rs:#RecordSet = null}
{def make-grid =
{CommandButton
label = "レコードセットの作成",
{on Action do
def rf-ary = {{Array-of RecordField}}
{for i:int = 0 below {columns-tf.value.to-int} do
{rf-ary.append
{RecordField {String i}, nullable? = true}
}
}
set rs =
{RecordSet
{RecordFields
{splice rf-ary}
}
}
{for i:int = 0 below {records-tf.value.to-int} do
def new-r = {rs.new-record}
{rs.append new-r}
}
set grid =
{RecordGrid
width = 7in
,height = 5in
}
{col-ary.clear}
||対象レコードセットのフィールド数だけ、
||独自のレコードグリッドを作成する
{for rf in rs.fields do
{col-ary.append
{RecordGridColumn
rf.name
}
}
}
set grid.columns = col-ary
set grid.record-source = rs
}
}
}
{def get-cell-cb =
{CommandButton
label = "セルの取得",
{on Action do
def dt = {DateTime}
def cell-ary = {{Array-of RecordGridCell}}
let cnt:int = 0
{for r in grid.records do
{for col in grid.columns do
{if-non-null cell = {grid.ui.get-cell-at r, col} then
{if {cell-ary.find cell} == -1 then
{cell-ary.append cell}
set cnt = cnt + 1
}
}
}
}
{popup-message cnt & "個のセルを取得(" & {dt.elapsed} & ")"}
}
}
}
{def gc-cb =
{CommandButton
label = "ガベージコレクト",
{on Action do
{garbage-collect}
}
}
}
{def reset-grid-cb =
{CommandButton
label = "グリッドのリセット",
{on Action do
||★point
||セルをガベージ対象にするには、
||RecordGrid.columns に渡した元の配列をクリアする!
{col-ary.clear}
set grid.record-source = null
set grid = null
}
}
}
{HBox make-grid, get-cell-cb, reset-grid-cb, gc-cb}