TableとRecordGridの速度比較
下図のように1000行を表示するプログラムを「Table」、「RecordGrid」を使ってそれぞれ作成し、速度を比較してみました。

||StopWatchクラスで処理時間計測開始
{let v_sw:StopWatch = {StopWatch}}
{v_sw.start}
{let v_tbl:Table = {Table
border-width = 1pt,
vertical-line-width = 1pt,
horizontal-line-width = 1pt,
cell-border-color="#cccccc",
background="#ffffff"}}
{for x:int=1 to 1001 do
||1行面は見出し
{if x == 1 then
{v_tbl.add
{row-prototype height=20pt,
{cell background="#B0D0FF",
{TextFlowBox width = 150pt, "カラム名"}
},
{cell background="#B0D0FF",
{TextFlowBox width = 150pt, "データ"}
}
}
}
else
{v_tbl.add
{row-prototype height=20pt,
{cell
{TextFlowBox width = 150pt, "カラム名" & (x - 1)}
},
{cell
{TextField width = 150pt}
}
}
}
}
}
{let v_box:ScrollBox = {ScrollBox width = 330,height = 300,v_tbl}}
{value v_box}
||処理時間出力
{output "Tableを使って作成:" & {v_sw.elapsed} & "で表示完了"}
||RecordGridのセルにコントロールをセットするためのclass定義----------
{define-class public open anyCell {inherits StandardRecordGridCell}
{constructor public {default}
{construct-super}
set self.margin =2pt
}
{method public open {refresh-data}:void
{self.clear}
let (data:any, valid?:bool) = {self.get-data}
{self.add-internal data}
}
}
||RecordGridのセルにコントロールをセットするためのclass定義----------END
||StopWatchクラスで処理時間計測開始
{let v_sw:StopWatch = {StopWatch}}
{v_sw.start}
{let v_box:VBox = {VBox}}
{let v_recFieldsArray:{Array-of RecordField} = {new {Array-of RecordField}}}
||RecordGridのフィールド(列)定義
{v_recFieldsArray.append
{RecordField "colName",caption="列名", domain = any}
}
{v_recFieldsArray.append
{RecordField "dataField",caption="データ", domain = any}
}
||RecordGridのフィールド(列)の型定義(ここのcell-specでカスタムセルを指定してコントロールを表示する)
{let v_recGridColumnArray:{Array-of RecordGridColumn} = {new {Array-of RecordGridColumn}}}
{v_recGridColumnArray.append
{RecordGridColumn "colName", sort-spec=null,cell-spec=anyCell,width=150pt}
}
{v_recGridColumnArray.append
{RecordGridColumn "dataField", sort-spec=null,cell-spec=anyCell,width=150pt}
}
||RecordFieldをもとにRecordSetを作成
{let v_recSet:RecordSet = {RecordSet {RecordFields {splice v_recFieldsArray}}}}
||RecordSetに1000件のデータを追加
{for x:int=1 to 1000 do
let v_record:RecordData = {RecordData}
{v_record.set
"colName",
{TextFlowBox width = 150pt, "カラム名" & x}
}
{v_record.set
"dataField",
{TextField width = 150pt}
}
{v_recSet.append v_record}
}
||RecordField,RecordGridColumn,RecordSetをもとにRecordGridを作成
{let v_recGrid:RecordGrid = {RecordGrid
grid-line-color = "#758294",
alternate-row-background = "#E1E1E1",
select-current-record? = false,
cells-take-focus? = false ,
width = 320,
height = 300,
header-options ={RecordGridRowOptions
background = "#B0D0FF",halign = "left"},
background="white",
record-source = v_recSet,
display-navigation-panel? = false,
display-record-selectors? = false,
{splice v_recGridColumnArray}}
}
{value v_box}
{v_box.add v_recGrid}
||処理時間出力
{output "RecordGridを使って作成:" & {v_sw.elapsed} & "で表示完了"}
この結果は、Tableを使った場合が「1.063秒」で、RecordGridの場合が「0.091s」でした。 次に、データ件数を100件に減らして試してみたところ、Tableが「0.093秒」、RecordGridの場合が「0.019s」でした。
以上の結果から、RecordGridを使うと、データ件数の増減から受ける影響はさほどなく、ほぼ同じレスポンスで処理できることがわかります。
まとめ
画面描画にかかる時間を短縮したい場合、配置するコントロールの数を少なくするのが1番ですが、そうもいかない場合は「TabContainer」や「RecordGrid」の利用を検討してみてはいかがでしょうか。また、よく確認すると「HBox」や「VBox」など必要のないコンテナが画面に含まれている場合もあります。こういったものもレスポンスを悪くする原因になるので、画面のコントロールを今一度見直してみると、改善につながるかもしれません。


