version 2004 (Modified)
配列は言語オブジェクトです。決して画面に表示されない配列を作成、使用できます。しかし、配列は同時にユーザインタフェースオブジェクトでもあります。配列では、以下のタイプのフォームオブジェクトがサポートされます。
・ポップアップメニュー/ドロップダウンリスト
・コンボボックス
・スクロールエリア
・タブコントロール
・リストボックス
(リストボックスを除く)これらのオブジェクトは、デザインモードのフォームエディタで、プロパティリストウィンドウのデフォルト値ボタンを用いて事前に内容を定義できますが、配列コマンドを使用してプログラムで定義することもできます。いずれの場合も、フォームオブジェクトは開発者または4Dが作成した配列によってサポートされます。
これらのオブジェクトを使用するとき、その配列で選択された要素を調べることにより、オブジェクト内のどの項目が選択されているかを検出できます。逆に、選択する要素を配列に設定して、オブジェクトの中の特定の項目を選択することもできます。
配列がフォームオブジェクトのサポートに使用される場合、この配列は、ランゲージオブジェクトとユーザインタフェースの2つの性質を併せ持ちます。例えば、フォームにスクロールエリアを作成します:
関連付けられた変数の名前(この例ではatNames)が、スクロールエリアの作成と処理に使用する配列名となります。
Notes:
・2次元配列やポインタ配列は表示できません。
・リストボックスタイプのオブジェクト(複数の配列を含む場合があります)を管理する上で、特定の状況が数々存在します。詳細についてはリストボックスオブジェクトの管理の節で説明しています。
例題: ドロップダウンリストを作成する
次の例では、配列に値を格納し、それをドロップダウンリストに表示する方法を示します。配列arSalariesは、ARRAY REALコマンドを使用して作成します。これには、社内で社員に支払われる基準給与がすべて入っています。ユーザがドロップダウンリストから要素を選択すると、[Employees]Salaryフィールドに選択された値が代入されます。
フォームにarSalariesドロップダウンリストを作成する
ドロップダウンリストを作成し、それを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: 配列選択要素についての詳細は、次の節を参照してください。
選択した値を[Employees]Salaryフィールドへ代入する
arSalariesドロップダウンリストで選択された値を調べるには、オブジェクトのOn Clickedイベントを処理する必要があります。選択された要素の要素番号は、配列arSalaries自体の値です。したがって、式arSalaries{arSalaries}はドロップダウンリストで選択した値を返します。
arSalaries ドロップダウンリストの完全なメソッドは、以下のようになります:
Case of
: (Form event=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;<)
tエリアは右のように表示されます。
要素の追加と削除
APPEND TO ARRAY, INSERT ELEMENTおよびDELETE ELEMENTコマンドを使用して、要素の追加、挿入、削除ができます。
配列内のクリックの処理: 選択した要素のテスト
前述の例で、配列がスクロールエリアに表示されているとき、このエリアでのクリックは、以下のように処理できます:
` atNames エリアオブジェクトメソッド
Case of
: (Form event=On Load)
` 配列の初期化
ARRAY TEXT (atNames;5)
` ...
: (Form event=On Unload)
` 配列はもう必要ない
CLEAR VARIABLE(atNames)
: (Form event=On Clicked)
If (atNames#0)
vtInfo:="以下をクリックしました: "+atNames{atNames}
End if
: (Form event=On Double Clicked)
If (atNames#0)
ALERT ("以下をダブルクリックしました: "+atNames{atNames}
End if
End case
Note: 各イベントは、オブジェクトのプロパティでアクティブにしなければなりません。
シンタックスatNames{$vlElem}を使用して配列の特定の要素を処理でき、atNamesは配列中で選択されている要素の要素番号を返します。したがって、シンタックスatNames{atNames}は配列atNames内で選択されている要素の値を意味します。要素が選択されていない場合、atNamesはゼロになるため、If (atNames#0)という判定式は、要素が実際に選択されているかどうかを検出するために使用できます。
要素を選択済みに設定する
同様に、配列に値を割り当てることにより、プログラムから要素を選択できます。
例題
` 最初の要素を選択済みとします (配列が空でない場合) atNames:=1 ` 最後の要素を選択済みとします (i配列が空でない場合) 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
ポップアップメニュー、ドロップダウンリスト、スクロールエリア、タブコントロールは、通常同じ方法で扱うことができます。要素の値を変更したり、要素を追加や削除したりした場合でも、画面の再描画をするためにコードを追加する必要はありません。
Note: アイコン付きのタブコントロールを作成、使用したり、タブの有効と無効を切り替えるためには、タブコントロールをサポートするオブジェクトとして階層リストを使用しなければなりません。詳細はNew list コマンドの例題を参照してください。
コンボボックスの扱い
ポップアップメニュー、ドロップダウンリスト、スクロールエリア、タブコントロールは前節で説明したアルゴリズムによって制御できますが、コンボボックスの扱いはこれらと異なります。
コンボボックスは実際、値のリスト(配列の要素)が添付されたテキスト入力可能なエリアです。ユーザはこのリストから値を選択し、さらにテキストを編集できます。したがって、コンボボックスでは、選択した要素という概念は適用されません。
コンボボックスには、選択された要素というものはありません。ユーザがエリアに添付された値のいずれかを選択するたびに、その値が配列の要素ゼロに入ります。そしてユーザがテキストを編集すると、ユーザが変更した値が要素ゼロに入ります。
例題
` asColors コンボボックスオブジェクトメソッド
Case of
: (Form event=On Load)
ARRAY STRING(31;asColors;3)
asColors{1}:="青"
asColors{2}:="白"
asColors{3}:="赤"
: (Form event=On Clicked)
If (asColors{0}#"")
` オブジェクトは自動でこの値を変更します
` コンボボックスのOn Clickedイベントは
` 追加の処理が必要な場合のみ使用されます
End if
: (Form event=On Data Change)
` Find in arrayは要素0を無視するので、-1または>0が返される
If (Find in array(asColors;asColors{0})<0)
` 入力された値は、オブジェクトに添付された値の一つではない
` 再利用のためこの値をリストに追加する
APPEND TO ARRAY(asColors;asColors{0})
Else
` 入力された値は、リストに存在する
End if
End case
参照