このドキュメントでは、UTableのアーキテクチャについて包括的な説明 を行います。UTableを使用する場合は、このドキュメントを終わりまで 読むことをお勧めします。
UTableは表の内容となるデータをコンテントというオブジェクトに保持 します。また、UTableは以下に示す3つのコンテントを常に保持しており、 それぞれにデータを入れることができます。
Contentのみがスクロールバーによってスクロール可能です。また、フォー カスを得ることができるのもContent内のフィールドのみとなります。
HeaderContentとFooterContentはスクロールせずに常に表示領域の上と 下に描画されます。見出し行や集計行に利用してください。
コンテントは0個以上のレコードを持ちます。また、レコードは0個以上 のフィールドを持ちます。
ひとつのレコードが複数行から成り立つ場合もあります。
コンテント内でレコードはリストとして保持されます。つまり、特定の レコードにアクセスする場合は、以下のように先頭からのインデックス を指定します。
Table.Content.Records(10)
レコード内でフィールドはハッシュテーブルに保持されます。特定の フィールドにアクセスする場合は、任意の型のキーを指定する必要があ ります。
Table.Content.Records(10).Fields("KEY")
用語の説明はこのあたりにして、レコードやフィールドを生成する具体 的な方法を説明していきましょう。
コンテントにレコードを追加するにはAddRecordメソッドを呼びます。 AddRecordメソッドは追加されたレコードを返します。
Dim r As UTable.CRecord = Table.Content.AddRecord()
レコードにフィールドを追加するには、AddFieldメソッドを呼びます。 AddFieldメソッドには、フィールドのキー、フィールドプロバイダ(後 述)、フィールドの位置を指定します。なお、フィールドの位置を省略す ると、非表示のフィールドを生成することができます。
各レコードがそれぞれ違う形式のフィールドを持っていても問題ありま せん。たとえば次のようにすることができます。
Dim r As UTable.CRecord r = Me.Table.Content.AddRecord r.AddField(0, New CCaptionFieldProvider("AAA"), New UTable.CGrid.CRegion(0, 0, 1, 1)) r.AddField(1, New CTextFieldProvider(), New UTable.CGrid.CRegion(0, 1, 1, 1)) r = Me.Table.Content.AddRecord r.AddField(0, New CTextFieldProvider(), New UTable.CGrid.CRegion(0, 0, 1, 2)) r = Me.Table.Content.AddRecord r.AddField(0, New CTextFieldProvider(), New UTable.CGrid.CRegion(0, 0, 1, 1)) r.AddField(1, New CTextFieldProvider())
フィールドを生成する際に便利な機能を持ったCFieldBuilderクラスがあ ります。これを利用すると以下のように書くことができます。
Dim r As UTable.CRecord r = Me.Table.Content.AddRecord With New CFieldBuilder r.AddField(0, .Caption("AAA"), .Next) r.AddField(1, .Text(), .Next) End With r = Me.Table.Content.AddRecord With New CFieldBuilder r.AddField(0, .Text, .Next(2)) End With r = Me.Table.Content.AddRecord With New CFieldBuilder r.AddField(0, .Text, .Next) r.AddField(1, .Text) End With
CFieldBuildオブジェクトがどのようにフィールド位置を生成するかにつ いては、チュートリアルをご覧下さい。
コンテント内の全てのレコードの形式は同じだというケースは多いと思 います。こうしたときに利用できるのがレコードプロバイダです。
レコードプロバイダには、各レコードがどのようなフィールドを持つべ きなのかという情報を定義することができます。例えば以下のように書 きます。
Dim rp As New UTable.CRecordProvider With New CFieldBuilder rp.AddField(0, .Text("項目1"), .Next(, 2)) rp.AddField(1, .Text("項目2"), .Next) rp.AddField(2, .Text("項目3"), .Break.Skip.Next) End With
次のコードで、レコードプロバイダをコンテントに設定できます。 CreateCaptionメソッドは、Contentに与えられたレコードプロバイダの 内容を元に、HeaderContentに見出しのフィールドを生成します。
Me.Table.Content.SetRecordProvider(rp) Me.Table.CreateCaption()
レコードプロバイダを設定しておけば、単にAddRecordメソッドを呼ぶだ けで自動的にフィールドが生成されます。
For i As Integer = 1 To 10 Me.Table.Content.AddRecord() Next
AddFieldメソッドの2番目の引数に与えていたフィールドプロバイダにつ いて説明します。
フィールドプロバイダは、フィールドを生成、制御するためのオブジェ クトです。以下の種類のフィールドプロバイダが用意されています。
フィールドプロバイダの実装は必要に応じて新しく作成することができ ます。例えばコンボボックスを使用したいとか、画像を表示するフィー ルドがほしいなどといった場合は作成する必要があります。詳しく はフィールドプロバイダの作成をご 覧下さい。
全てのフィールドは自分自身を制御するフィールドプロバイダへの参照 を保持します。レコードプロバイダを使用した場合、各レコードの同じ キーのフィールドは1つのフィールドプロバイダのインスタンスを共有し ています。
フィールドの色、フォント、アライメント等といったプロパティを設定 する場合、いくつかのスコープが存在します。例えば表全体に設定する のか、特定のレコードに設定するのか、ひとつのフィールドにだけ設定 するのかということです。
スコープには以下の種類があります。
下に行くほど優先度は高くなります。例えば、表とフィールドに対して 異なる設定を行った場合、フィールドの設定が有効になります。
具体的に見ていきましょう。以下のコードで表全体の背景色を設定でき ます。BackColorBothは、偶数行と奇数行の両方の色を設定します。
Me.Table.Setting.BackColorBoth = Color.LightBlue
特定の列全体を制御する場合は、レコードプロバイダに定義されたフィー ルドに対して設定を行います。
Dim rp As New UTable.CRecordProvider With New CFieldBuilder rp.AddField(0, .Text("項目1"), .Next) With rp.AddField(1, .Text("項目2"), .Next) .Setting.BackColorBoth = Color.LightGreen End With rp.AddField(2, .Text("項目3"), .Next) End With
レコードのプロパティは次のように設定します。
Me.Table.Content.Records(3).Setting.BackColorBoth = Color.LightGray
フィールドのプロパティは次のように設定します。
Me.Table.Content.Records(3).Fields(1).Setting.BackColorBoth = Color.LightPink
フィールド上でEnterまたは印字可能な文字に対応したキーを押下するか、 ダブルクリックを行うと編集可能状態となります。この状態を編集モー ドと呼びます。なお、編集モード時はスクロールが不可能となります。
編集モードの間は、フィールド上に入力コントロールが出現します。こ のコントロールをエディタと呼びます。
UTable.Editorメソッドで現在のエディタを取得できます。このメソッド の戻り値がNothingかどうかで、編集モードかどうかが判断できます。
UTable上でのユーザによるキーボード操作は、キーボードオペレーショ ンというオブジェクトによって処理されます。このオブジェクトは UTable.KeyboardOperationメンバに対して設定・参照可能です。独自の キーボードオペレーションクラスを作成することで、キーボード操作の 動作をカスタマイズできます。詳しくはキー ボードオペレーションの作成をご覧下さい。