Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
RecordGridColumnの配列は、フィールドで定義するな
05-29-2014, 05:50 PM, (This post was last modified: 06-30-2014, 09:56 AM by umemura.)
#3
RE: RecordGridColumnの配列は、フィールドで定義するな
私の考え違いでした。メモリ解放されました。

下記のサンプルで試していたのですが、
ポイントは、グリッドに渡したカラムの配列をクリアする、ということのようです。

前のサンプルで、カラムの配列を明示的にクリアしていなくても、
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}



Messages In This Thread
RE: RecordGridColumnの配列は、フィールドで定義するな - by umemura - 05-29-2014, 05:50 PM
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('1083')