WorkSheetの使い方
Worksheetは、Excelのようにスプレッドシート風になっているGUIコンポーネントです。以下のような特徴があります。
- 式を埋め込み、セルの値を入力値として計算
- 値の入力のために標準GUIコントロールをセルに埋め込んで使用可能
- フォームやRecordGridを埋め込んでRecordSetデータを表示
Worksheetクラス
Worksheetクラスのコンストラクタには、以下のようなプロシージャがセットできます。
プロシージャ名 | 機能 |
value-cell | 値を表示するセル |
input-cell | 編集、入力するセル |
currency-cell | 通貨を含むセル |
formula-cell | 式を含むセル |
これらはCellSpecオブジェクトを戻り値として返し、セルの表示を制御します。
使い方
サンプルのWorksheetは、以下のようなコードで作成されています。
{Worksheet 4, 2, row = 0, col = 0, "A", {input-cell 0.0}, row = 1, col = 0, "B", {input-cell 0.0}, row = 2, col = 0, "C", {input-cell 0.0}, row = 3, col = 0, "A + B + C", {formula-cell {proc {dest:DataRef, a:DataRef, b:DataRef, c:DataRef}:void set dest.value = a.as-double + b.as-double + c.as-double }, {RelativeCellRef -3, 0}, {RelativeCellRef -2, 0}, {RelativeCellRef -1, 0} } }
ここでは、ワークシートのコンストラクタの中で、4行2列のワークシートのセルを以下のように1つずつ設定しています。
セルの場所 | 値 |
1行1列目 | "A", |
1行2列目 | {input-cell 0.0} |
2行1列目 | "B", |
2行2列目 | {input-cell 0.0}, |
3行1列目 | "C", |
3行2列目 | {input-cell 0.0}, |
4行1列目 | "A + B + C", |
4行2列目("A + B + C"の次)のセルとして記述されているformula-cellプロシージャが、数式のセルを設定しています。
formula-cellの第1引数となっているプロシージャ定義が、このセルが表示する値を決める数式です。引数として与えられたaセルの値とbセルの値を加算して、destセルにセットしています。destセルは数式を設定しているセル(row = 2,col = 0)、aセルはこのセルの3行上のセル、bセルは2行上のセル、cセルは3行上です。aとbをこれらのセルに紐付けているのが、続く3行のRelativeCellRefオブジェクトです。
{RelativeCellRef -3, 0}が3行上、{RelativeCellRef -2, 0}が2行上、{RelativeCellRef -1, 0}が1行上のセルを指し、この順に書くことで、aが3行上、bが2行上、cが1行上のセルを指すことを示しています。destセルはプログラマが明示的に設定する必要はなく、内部で自動的にこのセルを指します。
ここで、以下の部分は、Formula.sumに置き換えても同じ動作になります。
{proc {dest:DataRef, a:DataRef, b:DataRef}:void set dest.value = a.as-double + b.as-double }
Formulaクラスには、以下のような基本的な演算プロシージャが組み込みで用意されています。
プロシージャ名 | 機能 |
copy | 1つの引数を取り、ターゲットセルにそのセルの内容を表示します |
add | 2つの引数を取り、ターゲットセルにその値の和を表示します |
subtract | 2つの引数を取り、ターゲットセルにその値の差を表示します |
multiply | 2つの引数を取り、ターゲットセルにその値の積を表示します |
divide | 2つの引数を取り、ターゲットセルにその値の商を表示します |
sum | すべての引数の合計をターゲットセルに表示します |
product | すべての引数をかけ合わせた値をターゲットセルに表示します |
concat | すべての引数を連結した値をターゲットセルに表示します |
count | すべて引数の数をターゲットセルに表示します |
上記サンプルをFormula.sumプロシージャで書き換えると、次のようになります。
{Worksheet 4, 2, row = 0, col = 0, "A", {input-cell 0.0}, row = 1, col = 0, "B", {input-cell 0.0}, row = 2, col = 0, "C", {input-cell 0.0}, row = 3, col = 0, "A + B + C", {formula-cell Formula.sum, {RelativeRangeRef 3, 1, row = -3} } }
こちらの場合は、数式プロシージャの引数の指定に、1つずつセルを参照するRelativeCellRefの代わりに、RelativeRangeRefが使われています。RelativeRangeRefは複数のセルを含む矩形領域を参照します。
コンストラクタ引数は以下のようになっています。
コンストラクタ引数 | 参照値 |
rows:int | ターゲットセルの行番号に加えるオフセット値 |
cols:int | ターゲットセルの列番号に加えるオフセット値 |
row:int | 領域に含まれる行の数(デフォルト:0) |
col:int | 領域に含まれる列の数(デフォルト:0) |
上のコードでは、3行1列の矩形領域を、ターゲットセルの3行上のセルから定義しています。