Tech Note 33: Gridコントロールを使う

October 13, 2004

© NSB Corporation. All rights reserved.

[英語版]  

Grid(グリッド)コントロールはフォーマットされた表にデータを表示する簡単な方法を提供します。表は横の行と縦の列から構成されます。行と列が交差する枠をセルと呼びます。Samplesフォルダにある"Grid.prj"サンプルプロジェクトを参考にして、このコントロールがどのように動くかを確認してください。ここからの説明の中で、太字で書かれた言葉は、Gridコントロールのプロパティかメソッドです。それらを使うにはプロパティ名またはメソッド名の前に、コントロールの名前とピリオドを付けます。

A. IDE上でGridを設定する。

フォーム上にGridを置く場合、Gridオブジェクトを指定した後、Palm Screen上の適当な場所をクリックします。Cols(列)と Visible Rows(見える行)の数を指定します。Visible Rowsを変更すると、それぞれの行のサイズは保ったままGridのHeight(高さ)が増えます。行のサイズ(高さ)を変えるにはGridのHeightを変更します。Grid作成時は各列の幅は均等です:この幅の変更は実行時に行えます。フォームが読込まれる段階で自動的にグリッドを隠しておくことはできません。

Has Scrollbar(スクロールバーを表示)オプションを選ぶ場合、グリッドオブジェクトの右端にスクロールバーが表示されるよう、10ピクセルの空きを残してWidthの設定を行ってください。

B. 実行時にGridを初期化

Form Afterコード内で、実行時のグリッドの初期化をすべて行うことができます。最初にHide(隠す)を行うと良いでしょう。これによって表を更新してもスクリーンが繰り返し再描画されることがありません。次に列の幅、タイプ、初期値等をセットし、Show(見せる)を行ってグリッドを再度画面上に表示します。

列の幅を設定するには ColWidth(colNo)=p を使います。colNo は列番号で、p はピクセルの数を入れます。列はテキスト、数値、またはチェックボックスのタイプを設定できます。

各列のタイプを設定するには、ColType colNo, type, formatString を使います。type は次の内のどれかです:"text"、"numeric"、"checkbox"

列のタイプに"text"を指定した場合、文字列を値として入れることができます。formatStringAdd(追加)によって行が追加された時の初期値として使われます。通常は空白文字としての "" です。列のデフォルトタイプは"text"です。テキスト列のデータは左詰めに表示されます。

列のタイプを"numeric"にした場合、formatString によってどのように数値が表示されるかを設定でき、これはFORMAT関数と同様の方式で文字列を指定します。例えば、formatString に"nnn"を指定した場合、3桁の右詰めの数字を表示します。新しい行を追加時のデフォルト値は 0 です。

列のタイプを"checkbox"にした場合、formatString はオプションとしてチェックボックスの右に表示される文字列を設定します。デフォルトは空白文字としての "" です。テキストがないチェックボックスには、colWidthに 12 を設定するのが良いでしょう。チェックボックスのセルには文字列または数値を代入することができます。値が 0 か "0"の場合、チェックボックスはチェックされていない状態になり、それ以外の値の場合、チェックされた状態になります。デフォルトはチェックされていない状態です。

Example
'set up a grid with 3 columns: text, numeric and checkbox
grid1.hide
grid1.colwidth(1)=121
grid1.ColType 1,"text",""
grid1.colwidth(2)=14
grid1.ColType 2,"numeric","nnn"
grid1.colWidth(3)=12
grid1.ColType 3,"checkbox",""
displayGrid 'call another function to set initial values
grid1.show

C. Gridにデータを入れる

グリッドの設定ができましたら、Text(テキスト)、Value(数値)、TextMatrix(テキストマトリックス)、ValueMatrix(数値マトリックス)関数を使ってセルにデータの書き込みができます。TextValueはそれぞれセルに文字列と数値をセットします。カレントセル(コマンドが適用されるアクティブな状態にあるセル)は、Row(行)と Col(列)によって指定されます。カレントセルはグリッドのRow Colプロパティに値を代入することによって変更できます。

これを素早く行うにはTextMatrixValueMatrix関数を使います。これらの関数は行と列の値を引数として受け取るため、別に行と列のプロパティをセットする必要はありません。必要な全てのセルの更新が済んだらRedrawメソッドを使って表を更新します。

行を追加するにはAddメソッドを使います。RowDataプロパティを使うと、各行毎にユニークな値が保管できます。これは表示されません。Grid内の全ての行を削除するにはClearメソッドを使います。全て削除されるとRows(行)の値は 0 になります。また、Rowsの値を変更することによっても行を足したり削除したりできます。特定の行を削除したい場合は、Removeメソッドを使います。

MyGrid.Clear
For r=1 to 10
   MyGrid.add
   Grid.TextMatrix(r,1)="some data"
   Grid.ValueMatic(r,2)=2
   Grid.ValueMatix(r,3)=1
Next

D. データベースからGridにデータを入れる

データベースからグリッドへデータを流し込むことができます。これをするには多少の準備が必要です。最初に、データベース変数をDIMし、どのデータベースを読込むかを定義します。DIM AS DATABASE ステートメントを使用します。

Dim blueKey as Integer
Type dbBluesLayout
    Name as String
    age as Integer
    active as Integer
End Type
Dim dbBlues1 as Database "Blues", DbBluesRec, dbBluesLayout, BlueKey

ここでは"Blues"と名前のついたデータベースからデータを読込みます。データベース変数(これを使ってデータベースを参照する)はdbBlues1に設定しました。データベース内の各レコードはdbBluesLayout内にフィールドを持っています。1つのレコードを読んだ時、それはdbBluesRec変数に入れられます。データベースへのキーはblueKeyで整数型です。dbBluesRecが(グローバルではなく)通常の変数として自動的に形作られますので、このステートメントは、BindToDatabaseコールを行うルーチンの中に置かれなければなりません。

さてデータベースの定義が済みましたので、BindToDatabaseコールを使ってデータを直接グリッドにコピーします:

Grid1.bindToDatabase(dbBlues1, dbBluesRec.name, dbBluesRec.Age, _
 dbBluesRec.active) Where dbBluesRec.age>=70

このステートメントはdbBlues1によって参照されるデータベースからGrid1グリッドへデータをコピーします。次の3つの引数はデータベースレコード内のフィールドで、それぞれの列に入れられます。列の並び順はレコードレイアウト(dbBluesLayout)内のフィールドと同じである必要はなく、また全てのフィールドを使う必要もありません。オプションのWHEREは、グリッドにコピーするレコードを選ぶ時に使用します。これはIFステートメントに入れることができる式が有効です。

Visible Rowsで指定した数よりレコード数が多く、Has ScrollBarがセットされている場合、スクロールバーが表示され、全てのレコードを見ることが可能です。大量の行がある場合、スクロールの矢印の動作は非常に正確とは言えませんのでご注意下さい。レコードは表示される時にだけグリッドにコピーされますので、大きなデータベースを表示するためのスピードが遅くなることはありません。

レコードがそれぞれの行に読込まれると、データベース内のレコード番号が各行のrowDataにセットされます。これはグリッド内で特定の行がデータベースのどのレコードかを判断する時に便利です:

Dim recNo as integer
Dim err as integer
recNo=Grid1.rowData(Grid1.Row) 'get rowData for the selected row
err=dbPosition(dbBlues, recNo)
err=dbRead(dbBlues, dbBluesLayout)

E. グリッドとのやりとり

ユーザがグリッドをタップすると、グリッドオブジェクトのコードが実行されます。直接タイプしてデータをセルに入力することはできません。ルーチンが何をするか判断するためのいくつかの便利な変数が用意されています。Row(行)と Col(列)プロパティはカレント行と列を持っています。Rowを使ってRowData値を受け取り、元のデータベースレコードに渡したり、他のデータにアクセスしたりできます。

TextValueTextMatrixRowMatrixを使って値を変更することが可能です。しかし、グリッドがデータベースを基にしている場合、これらの値を変更してもデータベースは自動的に更新されません。データベースを更新するには、rowDataプロパティを使ってデータベースレコードを特定し、読み、書き、編集を行うコードをご自身で書いてください。

スクロールを使ったグリッドを使う場合、TopRowは便利なプロパティで、その時表示されている一番上の行番号を持っています。また、TopRowを変更することによって、グリッドを強制的にスクロールすることができます。


Dim    ステートメント

DIM varname AS type
DIM varArray(nnn) AS type
DIM varname AS type*length [,decimalPlaces]
DIM varArray(nnn) AS type*length[,decimalPlaces]
DIM varName AS DATABASE dbName, dbRec, dbLayout [, key]
説明

ファンクションやサブルーチン内で使用される変数を定義します。変数が配列の場合、nnnが予約される要素の数を指定します。

Type

 

Byte

一つの文字。データベースへの入力/出力は、一つの文字が書込まれる。(末尾のnull文字は含まない)

Database

データベースコマンドで使用されるデータベースリファレンスの定義に使用。 データベースがGridコントロールにバインドされる場合、余分に引数が必要になる。

Date

日付の値の保管に使用。これはPalmの内部フォーマットではない。データベースへの 入力/出力は、64-bit浮動小数点数が使用される。 日付は内部的には (year-1900)*10000+month*100+day として保管される。

Double

Floatと全て同様。

Float

整数および小数の両方の保管に使用。データベースへの入力/出力は、64-bit(8-byte)の倍精度浮動小数点フォーマットが使用される。

Integer

整数の保管に使用(小数点から右へのポジションは無し)。データベースへの入力/出力は、32-bit(4-byte)のinteger(整数)フォーマットが使用される。

Short

Integerに似ているが、データベースへの入力/出力は、16-bit(2-byte)フォーマットが使用される。

Single

データベースへの入力/出力が、32-bit(4-byte)の単精度浮動小数点フォーマットが使用されるのを除き、Floatと同様。

String

最大サイズが32767文字の文字列

Time

時間の値の保管に使用。これはPalmの内部フォーマットではない。データベースへの入力/出力は、64-bit浮動小数点数が使用される。 時間は内部的には hour*10000+minute*100+seconds として保管される。

UserType

TYPE および END TYPE ステートメントを参照。

Variant

SysTrapFunc および SysTrapSub ファンクションを参照。

lengthは何桁表示されるか指定します。DecimalPlacesは小数点より右側何桁かを指定します。これは最大でも lengthより2桁少なくてはなりません。

Gridで使用されるデータベースを定義する場合、varNameは変数名になります。DbNameはPalm OSデバイス上にあるデータベースの名前です。dbRecはグローバル変数で、データベースのカレントレコードの内容を参照するための名前です。dbLayoutはレコードの構成で、TYPEステートメントによって予め定義されている必要があります。keyは任意の変数で、dbNameデータベースに使われるキーです。このフォームは BindToDataBaseメソッドの最初の引数Varnameを定義するためだけに使用されます。

Dim income as float*12,2
Dim count as integer
Dim yesterday as date
Dim appt as time
Dim rates(12) as float
Dim Orders as database

Type dbBluesLayout
     Name as String
     age as Integer
     active as Integer
End Type
Dim blueKey as Integer
Dim dbBlues1 as Database "Blues" Creator "Grid" Keyed With Record BlueKey, dbBluesRec as dbBluesLayout

 

Grid オブジェクト

Gridオブジェクトは、データベースから自動的に読込まれるデータ、またはプログラム内で提供されるデータの表を表示します。グリッドの基本的な見た目はデザイン時に定義し、実行時にデータと一緒になります。

グリッドのセルがタップされると、グリッドのrow(行)とcol(列)プロパティがセットされ、プログラム内で使用することができます。ユーザは直接フィールドを編集することはできませんが、TextMatrixと ValueMatrixを使うことによって値の変更が可能です。 TextとValueはカレントセルに対して使えます。

このオブジェクトに関する詳細は、このハンドブックのセクション13をご覧下さい。

このオブジェクト特有のプロパティとメソッド

.BINDTODATABASE dbName, dbFieldNameList [Where condition]

データベースのデータを自動的にグリッドへ読込みます。DbNameはデータベース変数で、DIM WITH RECORDステートメントで予めセットします。DbFIeldNameListはデータベースのフィールド名のリストか、データベースのType構造名です。Conditionはオプションで、表示するレコードを選びます。フォーマットはIFステートメントと同じです。

.COL カレント列を得るか設定します。範囲は1からCOLS。
.COLS 列数を得ます。
.COLTYPE colNo, type, formatString

列のタイプとフォーマットを設定します。デフォルトはテキストタイプで値はnullです。違うタイプの列が必要な場合、実行時にこのメソッドを使って設定します。colNoはグリッド内の列の番号です。typeは"text"(テキスト)、"numeric"(数値)、"checkbox"(チェックボックス)のどれかになります。formatStringには文字列を入れますが、typeの値によってことなります。typeが"text"の場合、セルに最初に表示される文字列をformatStringに入れます。"numeric"の場合、FORMATステートメントで使われるフォーマット文字列を入れます。 "checkbox"の場合、チェックボックスの右にくる文字列を入れます。

.COLWIDTH(colNo) colNo(列番号)の列の幅を得るか設定します。
.ROW カレント行を得るか設定します。範囲は1からROWS。
.ROWDATA 行のrowdata値を得るか設定します。ユーザが定義する値。
.ROWS 行数を得るか設定します。
.TEXT テキストタイプのカレントセルの値を得るか設定します。
.TEXTMATRIX(rowNo, ColNo) rowNo(行番号)とColNo(列番号)のセルのテキスト値を得るか設定します。
.VALUE 数値タイプのカレントセルの値を得るか設定します。
.VALUEMATRIX(rowNo, ColNo) rowNo(行番号)とColNo(列番号)のセルの数値を得るか設定します。

サポートされてるプロパティ(デザイン時にセット)

Cols, Has Scrollbar, Height, Left, Top, Visible Rows, Width

他のサポートされてるメソッド("Methods"参照)

Add, Clear, Hide, Redraw, Remove, Show