4Dで階層リストボックスを使用できます。階層リストボックスとは、一列目の内容が階層形式で表示されるリストボックスのことです。このタイプの表現は繰り返される値や、( 国、地域、都市など) 階層的に表現される値を含む情報の表示に使用されます。
配列タイプのリストボックスのみが階層になることができます。
階層リストボックスはデータを表示する特別な方法ですが、データの構造 (配列) を変更することはありません。階層リストボックスは通常のリストボックスとまったく同様に管理されます (リストボックスオブジェクトの管理を参照)。
階層リストボックスを指定するには、2つの異なる方法があります:
階層リストボックスを含むフォームが最初に開かれるとき、デフォルトですべての行が展開されて表示されます。
配列中で値が繰り返されているとき、ブレーク行と階層ノードが自動でリストボックスに追加されます。例えば国、地域、名前、そして人口データを持つ市区が、リストボックスに4 つの配列で含まれているとします:
![](../../picture/178294/pict178294.en.png)
このリストボックスが階層形式で表示されると、最初の3つの配列は階層に含まれ、以下のように表示されます:
![](../../picture/178296/pict178296.en.png)
階層が構築される前に配列はソートされていません。例えばもし配列がデータAAABBAACCで構成されていると、取得される階層は以下のようになります:
> A
> B
> A
> C
階層ノードを展開あるいは折りたたむにはノードをクリックします。Alt+click (Windows) あるいは Option+click (Mac OS) を行うとすべてのサブ要素が展開されたり折りたたまれたりします。これらの操作はLISTBOX EXPAND と LISTBOX COLLAPSEコマンドを使用してプログラムで行うこともできます。
階層リストボックスはノードの展開/ 折りたたみ状態により、スクリーン上に表示される行数が変わります。しかし配列の行数が変わるわけではありません。表示が変わるだけでデータに変更はありません。
この原則を理解することは重要です。階層リストボックスに対するプログラムによる管理は常に配列データに対して行われるのであり、表示されたデータに対して行われるわけではないからです。特に、自動で追加されるブレーク行は、表示オプション配列では考慮されません (後述ブレーク行の管理参照)。
例として以下の配列を見てみましょう:
![](../../picture/178312/pict178312.en.png)
これらの配列が階層的に表示されると、2 つのブレーク行が追加されるため、"Quimper" 行は2 行目ではなく4 行目に表示されます:
![](../../picture/178314/pict178314.en.png)
階層であってもなくても、リストボックスにどのようにデータが表示されているかにかかわらず、"Quimper" が含まれる行を太字にしたい場合はステートメントStyle{2} = bold を使用しなければなりません。配列中の行の位置のみが考慮されます。
この原則は以下のものを管理する内部的な配列に適用されます:
例えばRennesを含む行を選択したい場合、以下のように書きます:
非階層表示:
![](../../picture/178316/pict178316.en.png)
階層表示:
![](../../picture/178318/pict178318.en.png)
注: 親が折りたたまれているために行が隠されていると、それらは選択されなくなります。(直接あるいはスクロールで) 表示されている行のみを選択できます。言い換えれば行を選択かつ隠された状態にすることはできません。
選択と同様、LISTBOX GET CELL POSITION コマンドは階層リストボックスと非階層リストボックス同じ値を返します。つまり以下の両例題で、LISTBOX GET CELL POSITION は同じ位置 (3;2) を返します。
非階層表示:
![](../../picture/178320/pict178320.en.png)
階層表示:
![](../../picture/178322/pict178322.en.png)
ユーザがブレーク行を選択すると、LISTBOX GET CELL POSITIONは 対応する配列の最初のオカレンスを返します。以下のケースで:
![](../../picture/178326/pict178326.en.png)
LISTBOX GET CELL POSITIONは (2;4) を返します。プログラムでブレーク行を選択するにはLISTBOX SELECT BREAKコマンドを使用します。
ブレーク行はリストボックスのグラフィカルな表示 (スタイルやカラー) を管理する内部的な配列では考慮されません。しかしオブジェクトのグラフィックを管理する
オブジェクト(フォーム)テーマのコマンドを使用してブレーク行の表示を変更できます。階層を構成する配列に対して、適切なコマンドを実行します。
以下のリストボックスを例題とします (割り当てた配列名は括弧内に記載しています):
非階層表示:
![](../../picture/178328/pict178328.en.png)
階層表示:
![](../../picture/178330/pict178330.en.png)
階層モードではtStyleやtColors配列で変更されたスタイルは、ブレーク行に適用されません。ブレークレベ ルでカラーやスタイルを変更するには、以下のステートメントを実行します:
注: このコンテキストでは、配列は割り当てられたオブジェクトがないため、配列変数を使用したシンタックスのみがオブジェクトプロパティコマンドで動作しま す。
結果:
![](../../picture/178332/pict178332.en.png)
サブ階層のすべての行が隠されているとき、ブレーク行は自動で隠されます。先の例題で1から3行目までが隠されていると、"Brittany"ブレーク行は表示されません。
On Expand や On Collapse フォームイベントを使用して階層リストボックスの表示を最適化できます。
階層リストボックスはその配列の内容から構築されます。そのためこれらの配列すべてがメモリにロードされる必要があります。大量のデータから (SELECTION TO ARRAYを使用して) 生成される配列を元に階層リストボックスを構築するには、表示速度だけでなくメモリ利用量の観点からも困難が伴います。
On Expand と On Collapse フォームイベントを使用してこの制限を回避できます。例えばユーザーのアクションを元に階層の一部だけを表示したり、必要に応じて配列をロード/アンロードできます。
これらのイベントのコンテキストでは、LISTBOX GET CELL POSITIONコマンドは、行を展開/折りたたむためにユーザーがクリックしたセルを返します。
この場合、開発者がコードを使用して配列を空にしたり値を埋めたりしなければなりません。実装すべき原則は: