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行上のセルから定義しています。

