配列は言語オブジェクトです。決して画面に表示されない配列を作成、使用できます。しかし、配列は同時にユーザインタフェースオブジェクトでもあります。配列では、以下のタイプのフォームオブジェクトがサポートされます。
- ポップアップメニュー/ドロップダウンリスト
- コンボボックス
- スクロールエリア (4D v13より廃止予定)
- タブコントロール
- リストボックス
(リ ストボックスを除く)これらのオブジェクトは、デザインモードのフォームエディタで、プロパティリストウィンドウのデフォルト値ボタンを用いて事前に内容 を定義できますが、配列コマンドを使用してプログラムで定義することもできます。いずれの場合も、フォームオブジェクトは開発者または4Dが作成した配列 によってサポートされます。
これらのオブジェクトを使用するとき、その配列で選択された要素を調べることにより、オブジェクト内のどの項目が選択されているかを検出できます。逆に、選択する要素を配列に設定して、オブジェクトの中の特定の項目を選択することもできます。
配列がフォームオブジェクトのサポートに使用される場合、この配列は、ランゲージオブジェクトとユーザインタフェースの2つの性質を併せ持ちます。例えば、フォームにスクロールエリアを作成します:

関連付けられた変数の名前(この例ではatNames)が、スクロールエリアの作成と処理に使用する配列名となります。
Notes:
- 配列の選択された要素は内部では整数型の変数に保存されています。結果として、この機能は32,767個以上の要素を持つ配列に対しては使用することができません(ただし、それほど大量の要素はフォームオブジェクトとしての表示するにも適していません)。
- 2次元配列やポインタ配列は表示できません。
- リストボックスタイプのオブジェクト(複数の配列を含む場合があります)を管理する上で、特定の状況が数々存在します。詳細についてはの節で説明しています。
次の例では、配列に値を格納し、それをドロップダウンリストに表示する方法を示します。配列arSalariesは、ARRAY REALコマンドを使用して作成します。これには、社内で社員に支払われる基準給与がすべて入っています。ユーザがドロップダウンリストから要素を選択すると、[Employees]Salaryフィールドに選択された値が代入されます。
ドロップダウンリストを作成し、それをarSalariesと名付けます。ドロップダウンリストの変数名は、配列の名前と同じでなければなりません。

オブジェクトのOn Loadイベントを使用し、配列arSalariesを初期化します。これを行うには、次に示すように、プロパティリストウインドウでこのイベントを有効にします:

オブジェクトメソッドボタンをクリックして、次のようなメソッドを作成します:

以下のメソッドは:
ARRAY REAL(arSalaries;10)
For($vlElem;1;10)
arSalaries{$vlElem}:=2000+($vlElem*500)
End for
税引き前の年間給与 ($30,000から$84,000まで) に対応する、2500, 3000... 7000の数値配列を作成します。
以下のメソッドは:
arSalaries:=Find in array(arSalaries;[Employees]Salary)
If(arSalaries=-1)
arSalaries:=0
End if
新規レコードの作成と既存レコードの修正の両方を処理します。
- 新規レコードを作成する場合、[Employees]Salaryフィールドの初期値はゼロです。この場合、Find in array関数は配列の中で値を検索できず、-1を返します。If (arSalaries=-1) という判定式により、arSalariesをゼロに設定して、ドロップダウンリストで要素がまったく選択されていないことを示します。
- 既存レコードを修正する場合、Find in array関数により配列内の値の位置が取得され、ドロップダウンリスト要素を、フィールドの現在の値に対応するよう選択します。特定の従業員の値がリストにない場合、If (arSalaries=-1) という判定式により、リストの任意の要素の選択が解除されます。
Note: 配列選択要素についての詳細は、次の節を参照してください。
arSalariesドロップダウンリストで選択された値を調べるには、オブジェクトのOn Clickedイベントを処理する必要があります。選択された要素の要素番号は、配列arSalaries自体の値です。したがって、式arSalaries{arSalaries}はドロップダウンリストで選択した値を返します。
arSalaries ドロップダウンリストの完全なメソッドは、以下のようになります:
Case of
:(Form event code=On Load)
ARRAY REAL(arSalaries;10)
For($vlElem;1;10)
arSalaries{$vlElem}:=2000+($vlElem*500)
End for
arSalaries:=Find in array(arSalaries;[Employees]Salary)
If(arSalaries=-1)
arSalaries:=0
End if
:(FORM Event=On Clicked)
[Employees]Salary:=arSalaries{arSalaries}
End case
このドロップダウンリストは次のように表示されます:


次の節では、配列をフォームオブジェクトとして使用する際の一般的な基本操作を説明します。
配列の現在のサイズは、Size of arrayコマンドを使用して取得できます。前述の例の場合、次のコードは5を表示します:
ALERT("atNames配列のサイズは: "+String(Size of array(atNames)))
単一レベルの並び替えにはSORT ARRAYコマンドを、マルチレベルの並び替えにはMULTI SORT ARRAYコマンドを使用できます。配列がスクロールエリアに表示されているとします:
a. まずエリアは下図の左のリストのように表示されています。
b. 以下のコードを実行すると:
SORT ARRAY(atNames;>)
エリアは下図の中央のように表示されます。
c. 以下のコードを実行すると:
SORT ARRAY(atNames;<)
エリアは下図の右のように表示されます。


APPEND TO ARRAY, INSERT ELEMENTおよびDELETE ELEMENTコマンドを使用して、要素の追加、挿入、削除ができます。
前述の例で、配列がスクロールエリアに表示されているとき、このエリアでのクリックは、以下のように処理できます:
注: 各イベントは、オブジェクトのプロパティでアクティブにしておく必要があります。
シンタックスatNames{$vlElem}を使用して配列の特定の要素を処理でき、atNamesは配列中で選択されている要素の要素番号を返します。したがって、シンタックスatNames{atNames}は配列atNames内で選択されている要素の値を意味します。要素が選択されていない場合、atNamesはゼロになるため、If (atNames#0)という判定式は、要素が実際に選択されているかどうかを検出するために使用できます。
同様に、配列に値を割り当てることにより、プログラムから要素を選択できます。
atNames:=1
atNames:=Size of array(atNames)
atNames:=0
If((0<atNames)&(atNames<Size of array(atNames))
atNames:=atNames+1
End if
If(1<atNames)
atNames:=atNames-1
End if
Find in array コマンドは、配列内の特定の値を検索します。前述の例を使用すると、次のコードは、リクエストダイアログボックスに“Richard”と入力した場合に、その値が“Richard”である要素を選択します:
$vsName:=Request("名前を入力:")
If(OK=1)
$vlElem:=Find in array(atNames;$vsName)
If($vlElem>0)
atNames:=$vlElem
Else
ALERT($vsName+"は名前のリストに存在しません。")
End if
End if
ポップアップメニュー、ドロップダウンリスト、スクロールエリア、タブコントロールは、通常同じ方法で扱うことができます。要素の値を変更したり、要素を追加や削除したりした場合でも、画面の再描画をするためにコードを追加する必要はありません。
注: アイコン付きのタブコントロールを作成、使用したり、タブの有効と無効を切り替えるためには、タブコントロールをサポートするオブジェクトとして階層リストを使用しなければなりません。詳細な情報については階層リストの管理 および タブコントロール を参照してください。
ポップアップメニュー、ドロップダウンリスト、スクロールエリア、タブコントロールは前節で説明したアルゴリズムによって制御できますが、コンボボックスの扱いはこれらと異なります。
コンボボックスは実際、値のリスト(配列の要素)が添付されたテキスト入力可能なエリアです。ユーザはこのリストから値を選択し、さらにテキストを編集できます。したがって、コンボボックスでは、選択した要素という概念は適用されません。
コンボボックスには、選択された要素というものはありません。ユーザがエリアに添付された値のいずれかを選択するたびに、その値が配列の要素ゼロに入ります。そしてユーザがテキストを編集すると、ユーザが変更した値が要素ゼロに入ります。