Archive for the ‘gs:table-set-cell’ Tag

newLISP で GUI する。。。または、gs:table を使ってみる。(解説編)

(以下は、 newLISP v 2.8.16 以上、または、guisever 1.42以上での話です。)

 昨日の gs:table を使った CSV viewer は、如何だったでしょうか?
 さて今日は、その解説をマニュアルを引用しながら行ないます。
 新しい guiserver のテーブル・ウィジェットは、以下の9つの関数と2つの内部変数、gs:table-fullgs:table-size、からなります。
以下の9つの関数と3つの内部変数、gs:table-cellgs:table-fullgs:table-size、からなります。

(gs:table sym-id sym-action [str-column-header-name ...])
(gs:table-add-column sym-id str-column-header-name ...)
(gs:table-add-row sym-id [str-columns ... ])
(gs:table-get sym-id)
(gs:table-get-cell sym-id int-row int-column)
(gs:table-get-size sym-id)
(gs:table-set-cell sym-id int-row int-column str-value)
(gs:table-set-column sym-id int-column-number int-width [str-justification])
(gs:table-set-row-number sym-id bool-row-number)

 関数名から大体の想像がつくと思いますが、
 先ずは、テーブル生成関数 gs:table から、

gs:table

syntax: (gs:table sym-id sym-action [str-column-header-name …])
parameter: sym-id – The name of the table.
parameter: sym-action – The handler function symbol when cell selected.
parameter: str-column-header-name – the optional column header name.

(訳注:sym-id で指定されたテーブルを生成します。)
str-column-header-name で指定された列が行無しで作成されます。
str-column-header-name に空文字列を指定した時は、(訳注:列の見出しに)列の番号が使われます(訳注:str-column-header-name を指定しない時は、column 1 になります)。
列無しなら、空テーブル (0 x 0) が作られます。
Creates a table with str-column-header-name specified column and empty row.
For empty strings specified as column headers, the column number will be used.
If there are no columns, an empty table (0 x 0) is created.

(訳注:イベント・ハンドラは、次のように記述します:

(define (table-action id row col data)
  (println "id=" id " row=" row " col=" col " data=" data))

id – テーブルの ID
row – 0 から始まる行番号
col – 0 から始まる列番号
data – base64 エンコードされていない文字列データ。(つまり、そのまま使えます)

 セルに移動すると発生します。
 セルの移動には、マウスの左クリック、矢印キー、return キー(下方、次の列の先頭、一列目の先頭)が使えます。
 セル内容の変更では、イベントは発生しません。
 )

(2010/10/04 イベント・ハンドラ部分を追加)
 最初に生成されるテープルは、列を指定できますが、行は付いていません。行は、後述するgs:table-add-rowで設定します。また、列も gs:table-add-column を使って後で追加できます。
 列の数は、str-column-header-name の数で決まりますが、他の guiserver のウィジェット生成関数のようにリストで渡せます。

(gs:table 'OutputArea 'table-action '("1" "2" "3"))
; or
(gs:table 'OutputArea 'table-action (map string (sequence 1 3)))

 str-column-header-name を指定しない時は、

(gs:table 'OutputArea 'table-action '())

 と等価で、表示は

 こんな感じ。

(gs:table 'OutputArea 'table-action )
(gs:table-add-column 'OutputArea "")

 という風に、gs:table-add-column を続けると、表示が

 となります。つまり、空テーブル (0 x 0) はならない?、、、実害はないですけどね。
 そして、

(gs:table 'OutputArea 'table-action "")

 と、str-column-header-name に空文字列を指定した時の表示は、

 さらに、

(gs:table 'OutputArea 'table-action "");
(gs:table-add-column 'OutputArea "")

 と、gs:table-add-column を追加して、

 こんな感じの表示。gs:table-add-column での空文字列指定では、列の見出しに列の番号が使われますが、gs:table では、空文字列そのものが、列の見出しになるようです。
 昨日の CSV viewer で、

(gs:table 'OutputArea 'table-action "1")

 としているのは、列の追加時に、

(gs:table-add-column 'OutputArea "")

 を使って、列の見出しを列の番号にするのに合わせたかったからです。
 (map string (sequence 1 n)) を使って、n 個の列を作っておくのが普通の使い方かも。
 さて、お次は、gs:table-add-column ですが、

gs:table-add-column

syntax: (gs:table-add-column sym-id str-column-header-name …)
parameter: sym-id – The name of the table.
parameter: str-column-header-name – Add column header name(s).

str-column-header-name が空文字列なら、名前は列番号に設定されます。
テーブル・サイズが追加されます。
When a column header name is empty, the name is set to the column number.
The table size grows.

 もはや、説明するまでもないですね。
 次は当然、行を追加する gs:table-add-row でしょう。

gs:table-add-row

syntax: (gs:table-add-row sym-id [str-columns … ])
syntax: (gs:table-add-row sym-id ([str-columns …))
parameter: sym-id – The name of the table.
parameter: str-columns – Add a row with contents in str-columns

各列を含む行を追加します。必要ならスクロールバーが現れます。
str-columns に内容が定義されないか、列の数より少ない定義の場合、列の内容は空になります。
複数の列の内容は、文字列のリストか gs:table-add-row の追加パラメータでも指定できます。
Add row with each column value. If necessary a scrollbar will appear.
If no contents is defined in str-columns, or if contents for less
columns is defined than available, column contents is left empty.
Mutliple multiple column content can be specified as either a list
of strings or addtional parameters of gs:table-add-row.

 これも説明は要らないですね。
 CSV viewer では、

(gs:table-add-row 'OutputArea (map string row))

 という形で使っています。変数row に入っているのが CSV ファイルの一行をリスト化したものです。
 そして、gs:table-set-row-number を使って行番号の表示をさせています。

gs:table-set-row-number

syntax: (gs:table-set-row-number sym-id bool-row-number)
parameter: sym-id – The name of the table.
parameter: bool-row-numbertrue if rowns should carry a row number; default nil.

行番号を表示/非表示します。デフォルトは、行番号の非表示です。
Show or hide the row number headers. The default is hiding row numbers.

 行番号は、1 から始まります。
 さて、CSV viewer で使っているテーブル・ウィジェット用関数の残りは2つ。
 まず、テーブルの大きさを取得する関数gs:table-get-size

gs:table-get-size

syntax: (gs:table-get-size sym-id)
parameter: sym-id – The name of the table.

return: table size list (row-size, column-size)

テーブル・サイズを取り出し、gs:table-size に保存します。
注記:追加された列や行は、変数gs:table-size に自動的に更新されません。
この変数を更新するために、gs:table-get-size を使って下さい。
Get table size, stored in gs:table-size.
Note, that adding columns or row will not automatically update
the gs:table-size variable. Use gs:table-get-size to update
this variable.

 マニュアルにあるように、実行すれば、テーブルの大きさが変数gs:table-size にリストで保存されますので、便利です。
 CSV viewer では、現在のテーブルの大きさより CSV テーブルが大きい時、行と列を追加する判断に使っています。
 また、この関数と後述する関数 gs:table-set-cell を使って、全テーブル・セルのクリアができます。

(define (clear-table table)
  (gs:table-get-size table)
  (dotimes (i (gs:table-size 0))
    (dotimes (j (gs:table-size 1))
      (gs:table-set-cell table i j ""))))

 引数table に gs:table で指定した sym-id を渡せば、どんなテーブルでもクリアされます(笑)。
 さて、中でテーブルの個々のセルに値を設定している関数 gs:table-set-cell は、

gs:table-set-cell

syntax: (gs:table-set-cell sym-id int-row int-column str-value)
parameter: sym-id – The name of the table.
parameter: int-row – The row of the cell set.
parameter: int-column – The column of the cell set.
parameter: str-value – The cell value.

return: The previous contents of the cell; also stored in gs:table-cell.

テーブル・セルを新しい内容(訳注:str-value)に設定し、古いセル内容を返します。
行と列の番号は、’0′ (zero) から始まります(テーブルに表示される番号は ‘1’ から始まります)。
セルの内容は、文字列として渡されます(訳注:str-value は文字列入力です)。
Sets a new table cell contents and returns the old cell contents. Row and
column numbering starts with ‘0’ (zero). The cell contents is passed
as a string.

 これも説明は要らないですね。注意点としては、列と行の番号表示は 1 から始まりますが、セルを指定する番号は列と行の共に 0 から始まるということくらい。
 さて、次は当然、gs:table-set-cell となりますが、長くなってきたので、残りの関数と併せて、次回に。CSV viewer でも使っていなかったし(笑)。

 以上、如何でしょうか?

広告