階層リストはフォームオブジェクトで、拡張/折り畳み可能な複数レベルのデータリスト表示に使用できます。
![](../../picture/22238/pict22238.ja.png)
フォーム中で、階層リストはデータの表示および入力に使用できます。リスト項目ごとに20億文字 (テキストフィールドの最大サイズ) までの文字を含めることができ、アイコンを割り当てることができます。一般的に階層リストはクリック、ダブルクリック、キーボードナビゲーション、そしてドラッグ&ドロップをサポートします。リストの内容を検索することも可能です (Find in list コマンド)。
階層リストは( New list または Copy list コマンドを使用することによって)プログラミングで全て作成することが出来ます。また、デザインモードのリストエディターで定義されたリストを使用(Load list コマンド)することで作成することもできます。
階層リストの内容やアピアランスは、"階層リスト"テーマのコマンドを使用して、プログラムで管理できます。特定のアピアランス等については オブジェクトプロパティ テーマのコマンドで設定できます (後述)。
OBJECT SET LIST BY REFERENCE または OBJECT SET LIST BY NAME コマンドを使用することによって、階層リスト参照をフォームオブジェクトの選択リスト(ソース、指定リスト、除外リスト)と、動的に関連付けることもできます。また、プロパティリストを使用することによって、リストエディターにて定義された選択リストをフォームオブジェクトと関連付けることもできます。
階層リストはメモリ上に存在するランゲージオブジェクトであり、同時にフォームオブジェクトでもあります。
ランゲージオブジェクトは倍長整数型のユニークな内部IDで参照されます (本マニュアル中ではListRefと表記)。このIDはリストを作成するNew list、Copy list、Load list、BLOB to listから返されます。メモリ中にランゲージオブジェクトのインスタンスはひとつのみしか存在せず、このオブジェクトに対して行われた変更は即座に使用されているすべての場所に適用されます。
フォームオブジェクトはユニークである必要はありません。同じ階層リストを同じフォームや異なるフォーム上で使用できます。他のフォームオブジェクト同様、ランゲージ中でシンタックス (*;"ListName") を使用してオブジェクトを指定します。
ランゲージオブジェクトとしての階層リストと、フォームオブジェクトとしての階層リストは、ListRef の値を格納した中間的な変数により接続されます。例えば:
のように記述するとListRefがmylistに格納され、階層リストフォームオブジェクトのプロパティリストにmylist変数名を記述でき、ランゲージオブジェクトを管理できます。
リストはフォームオブジェクトごとに個別の性質を、および他のリストフォームオブジェクトと共有される性質を持ちます。以下の性質はリストフォームオブジェクトごとに固有のものです:
- 選択された項目
- 項目の拡張/折りたたみ状況
- スクロールカーソルの位置
他の性質 (フォント、フォントサイズ、スタイル、入力コントロール、カラー、リストの内容、アイコン、その他) は他のリストフォームオブジェクトと共有され、個別に変更することはできません。
したがって、拡張/折りたたみ状況に基づくコマンドやカレントの項目に関するコマンド、例えば Count list items (最後の * 引数を渡さずに) を使用するとき、どのフォームオブジェクトに対する処理なのかを明示的に示すことが重要です。
メモリ中の階層リストを指定する場合は、ランゲージコマンドにListRef IDを使用しなければなりません。
フォームレベルで階層リストのオブジェクトを指定する場合は、コマンド中でシンタックス (*;"ListName") を使用して、オブジェクト名を指定します。このシンタックスは"オブジェクトプロパティ"テーマのコマンドで使用されるものと同じで、リストのプロパティに対して動作する"階層リスト"テーマのほとんどのコマンドで受け入れられます (このテーマのコマンドの説明を参照してください)。
警告, プロパティを設定するコマンドの場合、オブジェクト名に基づくシンタックスは、指定されたフォームオブジェクトのみがコマンドで変更されることを意味せず、それよりもコマンドの動作はこのオブジェクトの状態に基づきます。階層リスト共有の性質は常にすべてのオブジェクトで変更されます。
例えば、SET LIST ITEM FONT(*;"mylist1";*;thefont)を実行すると、mylist1フォームオブジェクトに関連付けられた階層リスト項目のフォントを変更します。コマンドはmylist1オブジェクトの現在選択されている項目を更新の対象としますが、変更はすべてのプロセスのすべてのリストに対して実行されます。
他のオブジェクトプロパティ管理コマンドのように、 ListName 引数で “@” 文字を使用できます。このシンタックスはフォーム中のオブジェクトグループを指定するために使用されます。しかし階層リストコマンドのコンテキストでは、 これはすべてのケースで適用されるわけではありません。このシンタックスはコマンドのタイプにより、2つの異なる効果があります:
4Dの汎用コマンドを使用して、フォーム上の階層リストオブジェクトのアピアランスを変更できます。これらのコマンドには (* 引数を使用して) 階層リストオブジェクト名または (標準シンタックスの) 変数名を渡します。
Note: 階層リストの場合、フォームの変数はListRef値を含んでいます。階層リストに関連付けられた変数を渡して属性を変更するコマンドを実行すると、複数の階層リストフォームオブジェクトがある時に、それらの一つを特定することができません。それぞれ異なる表示をさせたい場合はオブジェクト名で指定します。
以下は階層リストに対して適用可能なコマンドのリストです:
OBJECT SET FONT
OBJECT SET FONT STYLE
OBJECT SET FONT SIZE
OBJECT SET COLOR
OBJECT SET FILTER
OBJECT SET ENTERABLE
OBJECT SET SCROLLBAR VISIBLE
OBJECT SET SCROLL POSITION
OBJECT SET RGB COLORS
Reminder: OBJECT SET SCROLL POSITION コマンドを除き、オブジェクト名を指定したとしても、これらのコマンドは同じリストのすべての表示を変更します。
階層リストの特定のプロパティ (例えば入力可属性やカラーなど) は3つの異なる方法で設定できます: デザインモードのプロパティリスト、“オブジェクトプロパティ” テーマのコマンド、“階層リスト” テーマのコマンド。
これら3つの方法すべてをプロパティ設定に使用した場合、以下の優先順位が適用されます:
- “階層リスト” テーマのコマンド
- 汎用のオブジェクトプロパティコマンド
- プロパティリストのパラメタ
この原則は、コマンドが呼び出された順番に関係なく適用されます。階層リストコマンドを使用して個々に項目プロパティを変更すると、同等のオブジェクトプロパティコマンドは、そのあとに呼び出されたとしても、その項目に対しては効果を持たなくなります。例えばSET LIST ITEM PROPERTIES コマンドを使用して項目のカラーを変更すると、この項目に対してOBJECT SET COLOR コマンドは効果を持たなくなります。
階層リストのコンテンツにアクセスするには通常2つの方法、位置または参照のいずれかを使用します。
- 位置を使用する場合、項目を特定する ために、スクリーン上に表示されているリストの項目に関連する位置を基とします。結果は階層項目が拡げられているか折りたためられているかにより異なりま す。複数のフォームオブジェクトがある場合、フォームオブジェクトごとに拡張/折りたたみの状態が異なることに留意してください。
- 参照を使用する場合、リスト項目のitemRef IDを参照します。これにより、それぞれの項目を階層リスト中での位置や表示状態に関わらず特定できます。
階層リストのそれぞれの項目は倍長整数型の参照番号 (itemRef) を持ちます。この値は開発者が使用します。4Dはたんに番号を保存するだけです。
警告: どの倍長整数値も参照として使用できますが、0だけは特別な意味を持ちます。このテーマのほとんどのコマンドで、0は最後にリストに追加された項目を指定するために使用されます。
参照番号を使用するにあたりいくつかTipsを紹介します:
- 項目をユニーク値で識別する必要がない場合 (初心者レベル).
- 最初の例としてアドレスブックで使用するタブシステムを構築するとします。システムは選択されたタブの番号を返すので、それ以上の情報は必要ありません。この場合、項目参照番号について心配する必要はありません。0以外の値をitemRefに渡します。アドレスブックシステムの場合、デザインモードでA-Zのリストを定義することができる点に留意してください。またプログラムを使用して、レコードがない文字を取り除いたリストを作成することもできます。
- キーワードリストの利用を考えます。このリストはセッション終了時にSAVE LIST や LIST TO BLOBコマンドで保存され、セッション開始時にLoad list や BLOB to list コマンドで再度読み込まれます。このリストはフローティングパレットに表示され、ユーザがクリックすると最前面のプロセスの選択されたエリアに項目テキス トが挿入されます。ユーザはドラッグ&ドロップも使用できます。いずれの場合も重要なことは選択された項目のみを扱うということです。クリックの場合はGET LIST ITEMコマンドのitemPos引数に * を指定して、ドラッグ&ドロップの場合はDRAG AND DROP PROPERTIES コマンドから返される位置情報をGET LIST ITEM コマンドのitemPos引数に指定して、項目テキストを取得できます。この場合、個々の項目を識別する必要がないため、リスト構築の際itemRef 引数に0以外の任意の数値を渡すことができます。
- 部分的にリスト項目を識別する必要がある場合 (中級者レベル).
項目参照番号に、項目を処理する際に必要となる情報を格納することができます。この例はAPPEND TO LIST コマンドの例題で説明しています。この例題では、項目参照番号にレコード番号を格納しています。あわせて[Department]レコード由来の項目と[Employees]レコード由来の項目を区別する必要があり、この点も説明されています。 - すべての項目リストを個々に識別する必要がある場合 (上級レベル)
リストの全レベルにおいて、個々の項目を識別する必要のある複雑な階層リスト管理プログラムを作成する必要があるとします。これを実装する簡単な方法は独自のカウンタを使用することです。New list コマンドを使用してhlListリストを作成するとします。ここでvhlCounter変数を1に初期化します。APPEND TO LIST や INSERT IN LISTを呼び出すたびにこのカウンタをインクリメントし (vhlCounter:=vhlCounter+1)、 カウンタ値を項目参照番号に設定します。項目を削除する場合でもカウンタをデクリメントしないことが重要です。つまりカウンタは増え続けるのみです。この 方法でユニークな項目参照番号を保証できます。番号は倍長整数型なので、20億以上の項目をリストに追加したり挿入したりできます (こんなにも多くのデータを扱う際にはリストではなくテーブルを使用したほうが良いですが)。
Note:ビットワイズ演算子を使用して、項目参照番号に情報を格納できます。例えば2つの整数値、4バイトの値、32個のブール値です。
階層リストをユーザインタフェースとして使用し、選択された項目のみを処理する場合は、ほとんどの場合項目参照番号を必要としません。Selected list items や GET LIST ITEM を使用すれば、現在選択されている項目を扱うことができます。さらにINSERT IN LIST や DELETE FROM LIST などのコマンドは、選択された項目からの相対位置でリストを操作できます。
基本的に、選択に関係なく、プログラムで任意のリスト項目にアクセスする必要がある場合に項目参照番号が必要です。