配列フィールドでの作業
オブジェクト フィールドの利用 への移動
配列フィールドは、同じ型のフィールドのセットから構成されます。フィールド型は、スカラー(たとえば、浮動小数点、文字列など)でも、または非スカラー(ADT)であっても構いませんが、配列の配列フィールドは不可です。TDataSet の SparseArrays 配列は、配列フィールドの各要素に対して、一意の Data.DB.TField オブジェクトを作成するかどうかを指定します。
配列フィールド型のデータにアクセスするには、さまざまな方法があります。永続フィールドを使用しない場合、配列フィールドの要素にアクセスする前に、データセットの ObjectView プロパティは True に設定されなければなりません。
永続フィールドの利用
永続フィールド群を、配列フィールドの個々の配列要素にマップすることができます。たとえば、配列フィールド TelNos_Array を考えてみましょう。これは、文字列の 6 つの要素の配列です。Customer テーブル コンポーネントのために作成された次の永続フィールドは、 TelNos_Array フィールドとその 6 つの要素を表します:
CustomerTelNos_Array: TArrayField; CustomerTelNos_Array0: TStringField; CustomerTelNos_Array1: TStringField; CustomerTelNos_Array2: TStringField; CustomerTelNos_Array3: TStringField; CustomerTelNos_Array4: TStringField; CustomerTelNos_Array5: TStringField;
CustomerTELNOS_ARRAY: TArrayField; CustomerTELNOS_ARRAY0: TStringField; CustomerTELNOS_ARRAY1: TStringField; CustomerTELNOS_ARRAY2: TStringField; CustomerTELNOS_ARRAY3: TStringField; CustomerTELNOS_ARRAY4: TStringField; CustomerTELNOS_ARRAY5: TStringField;
これらの永続フィールドが指定されると、次のコードは永続フィールドを使用して、配列要素の値を、TelEdit という名前の編集ボックスに入力します:
TelEdit.Text := CustomerTelNos_Array0.AsString;
TelEdit->Text = CustomerTELNOS_ARRAY0->AsString;
配列フィールドの FieldValues プロパティの利用
子フィールドの値には、配列フィールドの FieldValues プロパティでアクセスすることができます。FieldValues は、Variant を受取り返すため、どの型の子フィールドも処理および変換することができます。次に例を示します:
TelEdit.Text := TArrayField(Customer.FieldByName('TelNos_Array')).FieldValues[1];
TelEdit->Text = ((TArrayField*)Customer->FieldByName("TelNos_Array"))->FieldValues[1];
FieldValues は TArrayField のデフォルト プロパティであるため、次のようにも記述できます:
TelEdit.Text := TArrayField(Customer.FieldByName('TelNos_Array'))[1];
#include <Data.DB.hpp>
String getPhoneNumber(TDataSet* ds, int index)
{
return static_cast<TArrayField&>(*ds->FieldByName("TelNos_Array"))[index];
配列フィールドの Fields プロパティの利用
TArrayField には Fields プロパティがあり、これを使用して個々のサブフィールドへのアクセスに使用することができます。これは以下に記載されているように、配列フィールド(OrderDates)は、リストボックスを null ではない配列要素で割り当てるために使用されています:
for I := 0 to OrderDates.Size - 1 do begin if not OrderDates.Fields[I].IsNull then OrderDateListBox.Items.Add(OrderDates[I]); end;
for (int i = 0; i < OrderDates->Size; ++i) if (!OrderDates->Fields->Fields[i]->IsNull) OrderDateListBox->Items->Add(OrderDates->Fields->Fields[i]->AsString);