ここは旧式の4DドキュメントWebサイトです。最新のアップデートされたドキュメントを読むには新サイトをご利用下さい→ developer.4d.com

ホーム

 
4D v20 R7
リストボックスオブジェクトの管理

リストボックスオブジェクトの管理  


 

 

このテーマのコマンドは、リストボックス型のフォームオブジェクトを扱うために設けられました。

リストボックスを使用するとデータを列と選択可能な行の形式で表現できます。さらに値の入力や列のソート、階層表示、行ごとの色の変更などさらに数多くの機能が用意されています。

4Dのフォームエディタでリストボックスオブジェクトタイプを完全に設定することが可能で、またプログラムから管理することもできます。フォームエディタでのリストボックスタイプのオブジェクトの作成および設定に関する詳細はデザインリファレンスマニュアルを参照してください。
リストボックスオブジェクトのプログラミングは、4Dの他のリストフォームオブジェクトと同じ方法で行われます。ただし以下の節で説明するように、特定のルールに従わなくてはなりません。

リストボックスオブジェクトには1つ以上のカラムを含めることができます。それぞれの列には4D配列、レコードのセレクション、コレクション、あるいはエンティティセレクションを関連付けることができます。レコードセレクションあるいはコレクション/エンティティセレクション型のリストボックスの場合、それぞれのカラムには式が割り当てられます(セレクション型のリストボックスの場合、カラムに直接フィールドを割り当てることも可能です)。

1つのリストボックス内に複数のデータソースタイプ(配列、セレクション、コレクションあるいはエンティティセレクション)を組み合わせて指定することはできません。データソースは、フォームエディタ上でリストボックスを作成する際に、プロパティリストで設定されます。それそれ以降プログラムで変更することはできません。

このタイプのリストボックスでは、それぞれの列に4Dの1次元配列を割り当てなければなりません。ポインター配列を除きすべてのタイプの配列を使用できま す。フォームエディターやOBJECT SET FORMATコマンドを使用して、列ごとに表示フォーマットを指定できます。

リストボックスのハイレベルコマンド (LISTBOX INSERT ROWSLISTBOX DELETE ROWS等) や配列操作コマンドを使用して、列の値 (データ入力や表示) を管理します。
例えば列の内容を初期化するには、以下の命令を使用できます:

 ARRAY TEXT(ColumnName;size)

リストを使用することもできます:

 LIST TO ARRAY("ListName";ColumnName)

警告: リストボックスが異なる配列サイズの列を含むとき、もっとも小さい配列サイズの数だけを表示します。開発者は、各配列の要素数を同じになるようにすべきで す。一つでも、リストボックスの列が空(配列未定義だったり、正しく再定義がされなかったときに発生します)の場合、リストボックスは何も表示しません。

このタイプのリストボックスでは、列ごとにフィールドや式を割り当てます。それぞれの行はセレクションのレコードを基に評価されます。セレクションはカレントセレクションまたは命名セレクションです。

デー タソースがカレントセレクションである場合、データベースに対して行われた変更は自動でリストボックスに反映され、またリストボックスへの変更も自動で データベースに適用されます。つまりカレントセレクションは常に両方で同じです。

注: セレクションタイプのリストボックスでは、LISTBOX INSERT ROWSLISTBOX DELETE ROWS コマンドを使用できないことに留意してください。

リストボックスの列に式を割り当てることができます。式は1つ以上のフィールドから構成できます (例えば [Employees]LastName+“ ”+[Employees]FirstName )。または単にフォーミュラも使用できます (例えば String(Milliseconds))。式にはプロジェクトメソッド、変数、配列要素も指定できます。

LISTBOX SET TABLE SOURCE コマンドを使用して、リストボックスに関連付けるテーブルを変更できます。

このタイプのリストボックスでは、各カラムは式に割り当てられている必要があります。各行の中身はコレクション要素ごと、あるいはエンティティセレクションのエンティティごとに評価されます。

コレクションあるいはエンティティの各要素は、This コマンドを通してアクセス可能なオブジェクトとして利用可能です。
カラム式にはプロジェクトメソッド、変数、あるいはフォーミュラを指定可能で、This を通して各エンティティあるいはコレクション要素オブジェクトにアクセスします。例: This.<propertyPath> (あるいはスカラー値のコレクションの場合は This.value でアクセス)。カラムをプログラムで変更するためには、LISTBOX SET COLUMN FORMULA および LISTBOX INSERT COLUMN FORMULA コマンドを使用します。

データソースがエンティティセレクションの場合、リストボックス側に対して行った変更は自動的にデータベースに保存されます。その一方で、データベース側に対して行った変更は、タッチされたエンティティがリロードされた後でリストボックス側に反映されます。

データソースがコレクションの場合、リストボックス内の値に変更を行った場合、その変更はコレクションにも反映されます。その一方で、コレクションに対して例えばコレクション テーマの様々なメソッドを使用して変更を行った場合、コレクション変数を自分自身に再度代入することで4D に明示的に変更を知らせる必要があり、それによってリストボックスのコンテンツは更新されます。例:

 myCol:=myCol.push("new value") //リストボックスにnew valueを表示

 

リストボックスオブジェクトは、以下4つの項目で構成されます:

  • オブジェクト自体
  • ヘッダー (表示/非表示制定可能、デフォルトで表示)
  • フッター (表示/非表示制定可能、デフォルトで表示)
これらの項目はフォームエディタ上では個別に選択できます。それぞれが独自のオブジェクト名や変数名を持ち、個別に処理されます。


リストボックスオブジェクトとは別に、各オブジェクトには以下のような名前が与えられます: 列はColumnN、ヘッダーはHeaderN、フッターはFooterN (Nは番号)。

各 項目タイプには独自の特性ならびに他の項目と共有する特性があります。例えば文字のフォントはリストボックスオブジェクトに一括して割り当てることも、列やヘッダー、フッターに対して個別に割り当てることもできます。これとは逆に、入力プロパティは列に対してのみ指定することができます。

このルールはリストボックスに使用できる “オブジェクトプロパティ” テーマのコマンドに対して適用されます。その機能に応じて、各コマンドをリストボックスや 列、ヘッダー、フッターに対して使用します。作業を行おうとする項目のタイプを設定するには、その項目に関連付けた名前や変数を渡します。

次の表は、リストボックスに使用できる “オブジェクトプロパティ” テーマのそれぞれのコマンドのスコープの詳細についてのまとめです:

オブジェクトプロパティコマンドオブジェクト列ヘッダー列フッター
OBJECT MOVEO
OBJECT GET COORDINATES OOOO
OBJECT SET RESIZING OPTIONS O
OBJECT GET RESIZING OPTIONS O
OBJECT GET BEST SIZEO
OBJECT SET FILTERO
OBJECT SET FORMATOOO
OBJECT SET ENTERABLEO
OBJECT SET LIST BY NAMEO
OBJECT SET TITLEO
_o_OBJECT SET COLOROOOO
OBJECT SET RGB COLORSOOOO
OBJECT SET FONTOOOO
OBJECT SET FONT SIZEOOOO
OBJECT SET FONT STYLEOOOO
OBJECT SET HORIZONTAL ALIGNMENTOOOO
OBJECT Get horizontal alignmentOOOO
OBJECT SET VERTICAL ALIGNMENTOOOO
OBJECT Get vertical alignmentOOOO
OBJECT SET VISIBLEOOOO
OBJECT SET SCROLLBARO
OBJECT SET SCROLL POSITIONO
OBJECT SET HELP TIPOOO
OBJECT Get help tipOOO

: 配列型のリストボックスではスタイル、フォントカラー、背景色、行ごとの表示を個別に指定できます。これはリストボックスのプロパティリストを使用して関連付けた配列を通して行います。これらの配列名はLISTBOX GET ARRAYS コマンドを使用して取得できます。

リストボックスオブジェクトやリストボックスの各列に対し、オブジェクトメソッドを付加することができます。オブジェクトメソッドの呼び出しは、次の順で行われます:

  1. 各列のオブジェクトメソッド
  2. リストボックスのオブジェクトメソッド
ヘッダーとフッターで発生したイベントは、その列のオブジェクトメソッドが受け取ります。

ヘッダーやフッターにOBJECT SET VISIBLEコマンドを使用すると、このコマンドに渡した引数に関わらず、そのリストボックス中のすべてのヘッダーやフッターが対象になります。例えばOBJECT SET VISIBLE(*;"header3";False)という命令の場合、指定したヘッダーだけではなく、header3が属するリストボックスの全ヘッダーを非表示にします。
OBJECT SET VISIBLEコマンドを使用してこれらのオブジェクトの表示/非表示を管理できるようにするには、フォームエディターレベルで表示に設定されていなければなりません (ヘッダーを表示フッターを表示オプションを選択する)。

Object with focusObject current定数とともに使用されるOBJECT Get pointer (以前のFocus objectSelf) はリストボックスやリストボックス列のオブジェクトメソッドで使用できます。これらはフォームイベントのタイプに基づきリストボックス、リストボックス列(1)、ヘッダー変数、またはフッター変数へのポインターを返します。以下の表に動作をまとめます:

イベントフォーカスのあるオブジェクトカレントのオブジェクト
On Clickedリストボックス
On Double Clickedリストボックス
On Before Keystroke
On After Keystroke
On After Edit
On Getting Focus列またはリストボックス (*)列またはリストボックス (*)
On Losing Focus列またはリストボックス (*)列またはリストボックス (*)
On Dropリストボックスソースリストボックス (*)
On Drag Overリストボックスソースリストボックス (*)
On Begin Drag Overリストボックスリストボックス (*)
On Mouse Enterリストボックス (**)リストボックス (**)
On Mouse Moveリストボックス (**)リストボックス (**)
On Mouse Leaveリストボックス (**)リストボックス (**)
On Data Change
On Selection Changeリストボックス (**)リストボックス (**)
On Before Data Entry
On Column Movedリストボックス
On Row Movedリストボックスリストボックス
On Column Resizeリストボックス
On Open DetailNilリストボックス (**)
On Close DetailNilリストボックス (**)
On Header Clickリストボックスヘッダー
On Footer Clickリストボックスフッター
On After Sortリストボックスヘッダ

(*) リストボックス中でフォーカスが更新されると、列へのポインターが返されます。フォームレベル上でフォーカスが更新されると、リストボックスへのポインターが返されます。列のオブジェクトメソッドのコンテキストでは、列へのポインターが返されます。
(**) 列のオブジェクトメソッドのコンテキストでは実行されません。

(1) 列へのポインターが返された時、指し示すオブジェクトはリストボックスのタイプによります。配列型のリストボックスにおいて、OBJECT Get pointer("ユーザーインターフェース"テーマ)は、フォーカスを取得したリストボックスの列(つまり配列)へのポインターを返します。 4Dのポインターのメカニズムを利用し、修正された配列の項目番号を調べることができます。例えば、ユーザーが列col2の5行目を変更した場合は、次の ようになります:

 $Column:=OBJECT Get pointer
  // $Columnにはcol2へのポインタが含まれる
 $Row:=$Column-> // $Row は 5

セレクション型のリストボックスで、OBJECT Get pointerは以下を返します:

  • フィールドが関連付けられた列の場合、そのフィールドへのポインター
  • 変数が関連付けられた列の場合、その変数へのポインター
  • 式が関連付けられた列の場合、Is nil pointerポインター

OBJECT SET SCROLL POSITION コマンド("オブジェクトプロパティ"テーマ)をリストボックスで使用できます。スクロールは、リストボックスの最初に選択された行または指定された行を表示させます。

EDIT ITEMコマンド("入力制御"テーマ)を使用して、リストボックスオブジェクトのセルを編集モードに移行することができます。

REDRAW  

REDRAW コマンド("ユーザーインターフェース"テーマ)をリストボックスのセレクションモードに対して適用した場合、コマンドはリストボックス内に表示されているデータの更新を実行します。

注: REDRAW コマンドはエンティティセレクション型のリストボックスではサポートされていません。

Displayed line number コマンド (“” テーマ) はリストボックスオブジェクトのOn Display Detail フォームイベントのコンテキストで動作します。

リストボックス管理、特にドラッグ&ドロップや並び替え操作を管理するために、特別なフォームイベントを使用できます。詳細については、Form Eventコマンドの節を参照してください。

リストボックス中でのデータのドラッグ&ドロップ管理は、Drop positionDRAG AND DROP PROPERTIESコマンドでサポートされます。これらのコマンドは特にリストボックスに適用されます。

行や列のドラッグ&ドロップと混同しないように注意してください。これらはLISTBOX MOVED ROW NUMBERLISTBOX MOVED COLUMN NUMBER コマンドでサポートされます。

リストボックスセルを入力可能にするには、以下の条件を満たす必要があります:

  • セルが属する列を入力可に設定する (そうしない場合、その列のセルには入力できません)。
  • On Before Data Entry イベントで$0から-1を返さない。
    カーソルがセルに入ると、その列のメソッドでOn Before Data Entryイベントが生成されます。このイベントのコンテキストから$0に-1を設定すると、そのセルは入力不可として扱われます。イベントがTabShift+Tabが押された後に生成されると、それぞれフォーカスは次あるいは前のセルに移動します。$0が-1でなければ (デフォルトは0)、列は入力化であり編集モードに移行します。

2つの配列で構築されるリストボックスを考えてみましょう。ひとつは日付でもう一つはテキストです。日付配列は入力不可に設定されていますが、テキスト配列は日付が過去でない場合に入力可とします。 

arrText列のメソッドは以下の通りです:

 Case of
    :(FORM Event=On Before Data Entry// セルがフォーカスを得た
       LISTBOX GET CELL POSITION(*;"lb";$col;$row)
  // セルの特定
       If(arrDate{$row}<Current date// 日付が昨日以前なら
          $0:=-1 // セルは入力不可
       Else
  // そうでなければ入力可
       End if
 End case

注: 4D v13以降、On Before Data Entry イベントはOn Getting Focus より前に生成されます。

データの整合性を保つため、セレクション型とエンティティセレクション型のリストボックスにおいては、レコード/エンティティに対する変更はセル内の編集が確定されたときに自動的に保存されます。確定は、以下のような場合を指します:

  • セルがアクティブでなくなったとき (ユーザーによるタブキー押下、クリック操作など)
  • リストボックスからフォーカスが外れたとき
  • フォームからフォーカスが外れたとき

データ入力・編集操作にともなって発生するイベントシーケンスは一般的には次のようになります:

アクションリストボックス型イベントシークエンス
セルが編集モードに切り替わったとき全てOn Before Data Entry
全てOn Getting Focus
セルの値が編集されたとき全てOn Before Keystroke
全てOn After Keystroke
全てOn After Edit
ユーザーによってセルが確定され、(タブキー、クリック操作などで) セルを移動したときセレクション型リストボックス保存
レコードセレクション型リストボックスOn saving an existing record トリガ(設定されていれば)
セレクション型リストボックスOn Data Change(*)
エンティティセレクション型リストボックスエンティティはオートマージオプション、オプティミスティック・ロックモードで保存されます(entity.save( ) を参照して下さい)。正常に保存できた場合には、エンティティは最新の更新が表示されます。保存操作が失敗した場合、エラーが表示されます。
全てOn Losing Focus

(*) エンティティセレクション型リストボックスでのOn Data Change イベントの場合:

  • カレント項目オブジェクト(データソーステーマ参照)には編集 の値が格納されます。
  • This オブジェクトには、編集 済み の値が格納されます。

注: コレクション/エンティティセレクション型では、式がnull に評価される場合にリストボックスでのデータ入力に制約があります。この場合、セル内のnull 値を編集あるいは削除することはできません。

ヘッダがクリックされると、デフォルトでリストボックスは自動的に標準的なカラムの並び替えを行います。標準的な並び替えとは、列の値を文字順に並べ替え、続けてクリックされると昇順/降順を交互に切り替えます。すべての列は常に自動で同期されます。

リストボックスの並び替え可プロパティの選択を解除すると、ユーザによる標準の並び替えを禁止することができます。

開発者は、LISTBOX SORT COLUMNSコマンドを使用するか、またはOn Header ClickOn After Sortフォームイベント (Form eventコマンドの節を参照) と4Dの配列管理コマンドを組み合わせて、独自の並び替えを設定することができます。

Note: 列のプロパティ"並び替え可"は、ユーザによる標準の並び替えにのみ影響を与えます。LISTBOX SORT COLUMNSコマンドでは、このプロパティが考慮されません。

列ヘッダに関連付けられた変数の値を使用すると、列の現在の並び替え状況(読み込み)や並び替え矢印の表示など、追加情報を管理することができます。

  • 変数が0のとき、列は並び替えられておらず、矢印は表示されていません;
  • 変数が1のとき、列は昇順で並び替えられていて、並び替え矢印が表示されています;
  • 変数が2のとき、列は降順で並び替えられていて、並び替え矢印が表示されています。

変数の値を設定して (例えばHeader2:=2)、ソートを表す矢印の表示を強制することができます。しかし列のソート順は変更されません、これを処理するのは開発者の役割です。On Header Clickイベントにともなうソート処理と並び替え矢印の管理をオブジェクトメソッドにて行う場合には、戻り値に「-1」を返すとヘッダーの自動アクションを阻止できます。

選択行の管理は、リストボックスのタイプが配列か、レコードのセレクションか、あるいはコレクション/エンティティセレクションかによって異なります。

  • セレクションタイプのリストボックス: 選択行はデフォルトでは、 $ListboxSetX と呼ばれる修正可能なセットにより管理されます(Xは0から始まり、フォーム内のリストボックスの数に応じて一つずつ増加していきます)。このセットはリストボックスのプロパティリストで定義します。このセットは4Dが自動 で管理します。ユーザがリストボックス中で1つ以上の行を選択すると、セットが即座に更新されます。他方、プログラムからリストボックスの選択を更新する た めに、"セット"テーマのコマンドを使用することができます。
  • コレクション/エンティティセレクション型リストボックス: セレクションは、専用のリストボックスプロパティを通して管理されます。選択された要素/エンティティはカレント項目オブジェクトが受け取り、選択された項目には選択された項目のコレクションであり、カレント項目位置は選択された要素あるいはエンティティの位置を返します。詳細な情報については、データソーステーマ の章を参照して下さい。
  • 配列タイプのリストボックス: LISTBOX SELECT ROWコマンドを使用して、プログラムからリストボックスの行を選択できます。
    リストボックスオブジェクトにリンクされた変数は、オブジェクト行の選択の取得、設定、保存に使用します。この変数はブール配列で、4Dが自動的に作成・保守を行います。この配列のサイズは、リストボックスのサイズにより決定されます。配列には列に関連付けられた最も小さな配列と同じ数の要素が含まれます。
    この配列の各要素には、対応する行が選択された場合にはTrueが、それ以外の場合はFalseが設定されます。4Dは、ユーザの動作に応じてこの配列の内容を更新します。これとは逆に、この配列要素の値を変更して、リストボックス中の選択行を変更することができます。
    他方、この配列への要素の挿入や削除はできず、行のタイプ変更もできません。
    : Count in arrayコマンドを使用して、選択された行の数を調べることができます。
    例えば、以下のメソッドは配列タイプのリストボックスで、最初の行の選択を切り替えます:

     ARRAY BOOLEAN(tBListBox;10)
      // tBListBox はフォーム内にあるリストボックス変数の名前
     If(tBListBox{1}=True)
        tBListBox{1}:=False
     Else
        tBListBox{1}:=True
     End if

リストボックスのプロパティリストで セレクションハイライトを非表示 オプションにチェックを入れている場合には、他のインターフェースオプションを活用してリストボックスの選択行を可視化する必要があります。詳細については選択行の見た目をカスタマイズ を参照ください。

: 階層モードのリストボックスの選択行管理については階層リストボックス を参照してください。

4D v12より、リストボックスを印刷することができます。2つの印刷モード、フォームオブジェクトのようにリストボックスを印刷するために使用できるプレビューモードと、フォーム内でリストボックスオブジェクト自身の印刷を制御できる詳細モードがあります。フォームエディタでリストボックスオブジェクトに"印刷"アピアランスを適用できる点に留意してください。

プレビューモードでのリストボックスの印刷は、標準の印刷コマンドやプリントメニューを使用して、リストボックスを含むフォームを直接印刷します。リストボックスはフォーム上に表示されている通りに印刷されます。このモードではオブジェクトの印刷をち密に制御することはできません。特に表示されている以上の行を印刷することはできません。

このモードでは、リストボックスの印刷はPrint object コマンドを使用してプログラムにより実行されます(プロジェクトフォームとテーブルフォームがサポートされています)。LISTBOX GET PRINT INFORMATION コマンドを使用してオブジェクトの印刷を制御できます。

このモードでは:

  • 印刷する行数がオブジェクトの元の高さよりも少ない場合、リストボックスオブジェクトの高さは自動で減少させられます ("空白"行は印刷されません)。他方、オブジェクトの内容に基づき高さが自動で増大することはありません。実際に印刷されるオブジェクトのサイズはLISTBOX GET PRINT INFORMATION コマンドで取得できます。
  • リストボックスオブジェクトは"そのまま"印刷されます。言い換えれば、ヘッダーやグリッド線の表示、表示/非表示行など、現在の表示パラメタが考慮されます。
    これらのパラメタには印刷される最初の行も含みます。印刷を実行する前にOBJECT SET SCROLL POSITION を呼び出すと、リストボックスに印刷される最初の行はコマンドで指定した行になります。
  • 自動メカニズムにより、表示可能な行以上の行数を含むリストボックスの印刷が容易になります。連続してPrint object を呼び出して、それぞれの呼び出し毎に新しい行セットを印刷することができます。LISTBOX GET PRINT INFORMATION コマンドを使用して、印刷が行われている間の状態をチェックできます。

リストボックスの背景色、フォントカラー、そしてフォントスタイルを設定するためにはいくつかの方法があります:

  • リストボックスオブジェクトのプロパティリストの使用
  • 列のプロパティリストの使用
  • リストボックスまたは列ごとの配列またはメソッドの使用
  • セルレベルでの定義(マルチスタイルテキスト時)

優先順位と継承の原理はそのままです。

同じプロパティに異なる値が複数のレベルにわたって適用された場合、以下の優先順位が適用されます:

優先度高セル単位(マルチスタイル使用時)
列の配列/メソッド
リストボックスの配列/メソッド
列のプロパティ
リストボックスのプロパティ
優先度低メタ情報式(コレクションあるいはエンティティセレクション型リストボックスの場合)

例として、リストボックスのプロパティにてリストボックスにフォントスタイルを設定し、列のスタイル配列を使用して列に対して異なるスタイルを設定した場合、後者の方が有効となります。

以下の様な、グレー/淡いグレーを交互に繰り返す行の背景色がリストボックスのプロパティで定義されたリストボックスについて考えます。同時に、行の中の少なくともどれか一つの値が負の値である行に関しては背景色がオレンジ色になるような背景色配列が設定されていたとします:

 <>_BgndColors{$i}:=0x00FFD0B0 // オレンジ
 <>_BgndColors{$i}:=-255 // デフォルト値

次に、負の値が入っているセルを濃いオレンジの背景色にしたい場合を考えます。これをするためには、それぞれの行に対して背景色を適用します。例えば、<>_BgndColor_1, <>_BgndColor_2 そして<>_BgndColor_3 のようにです。これらの配列の値はリストボックスのプロパティや一般的な背景色の設定より優先されます:

 <>_BgndColorsCol_3{2}:=0x00FF8000 // 濃いオレンジ
 <>_BgndColorsCol_2{5}:=0x00FF8000
 <>_BgndColorsCol_1{9}:=0x00FF8000
 <>_BgndColorsCol_1{16}:=0x00FF8000

新しい LISTBOX SET ROW FONT STYLE コマンドと LISTBOX SET ROW COLOR コマンドを使用しても同じ結果を得ることができます。こちらを使った方がコマンドが動的に配列を作成するので、列ごとのスタイル/カラー配列を事前に設定するのをスキップすることが出来るという利点があります。

継承  

それぞれの属性(スタイル、カラー、背景色)について、デフォルトの値を使用した場合、属性の継承が行われるようになっています:

  • セル属性について : 行の値を受け継ぎます
  • 行属性について : 列の値を受け継ぎます
  • 列属性について : リストボックスの値を受け継ぎます

このように、オブジェクトに高次のレベルの属性の値を継承させたい場合は、定義するコマンドの中に lk inherited (デフォルト値) を渡すか、対応するスタイル/カラー配列の要素の中に直接渡して下さい。

以下の様な、標準のフォントスタイルで行の背景色が交互に変わるリストボックスを考えます:

以下の様な変更を加えます:

  • リストボックスオブジェクトの行背景色配列プロパティを使用して、2行目の背景色を赤に変更します。
  • リストボックスオブジェクトの行スタイル配列を使用して、4 行目のスタイルをイタリックに変更します。
  • 5 列目の列オブジェクトの行スタイル配列を使用して、5 列目の二つの要素を太字に変更します。
  • 1、2 列目の列オブジェクトの行背景色配列を使用して、1、2 列目の要素一つずつ、計二つの背景色を濃い青に変更します:

リストボックスを元の状態に戻すには、以下の手順で元に戻せます:

  • 1、2 列目の背景色配列の要素 2 に定数 lk inherited 定数を渡します。これにより行の赤の背景色を継承します。
  • 5 列目のスタイル配列の要素 3 と 4 に定数 lk inherited を渡します。これにより、要素 4 を除いて標準のスタイルを継承します(要素 4 はリストボックスのスタイル配列にて指定されたイタリックの属性を継承します)。
  • リストボックスのスタイル配列の要素 4 に定数 lk inherited を渡します。これにより、4 行目のイタリックのスタイルが除去されます。
  • リストボックスの背景色配列の要素 2 に定数 lk inherited を渡します。これにより元の、背景色が交互に変わるリストボックスの状態に戻すことが出来ます。

配列型のリストボックス内にて、それぞれの行に対して"非表示"、"無効化"、"選択可能"のインターフェースプロパティを設定する事ができます。

この設定は、LISTBOX SET ARRAYコマンドあるいはプロパティリストを用いて指定できる行管理配列を使用する事で管理可能です:

行管理配列は倍長整数型で、かつリストボックスと同じ行数を含んでいる必要があります。詳細な情報については、リストボックス特有のプロパティの章を参照して下さい。

行管理配列のそれぞれの要素は、リストボックス内の対応する行のインターフェースステータスを定義します。"リストボックス"テーマ内の定数を使用する事で、三つのインターフェースプロパティが利用可能です:

定数 コメント
lk row is disabled 倍長整数 2 対応する行は無効化されています。テキストとチェックボックスなどのコントロール類は暗くなっているかグレーアウトされています。入力可能なテキスト入力エリアは入力可能ではありません。デフォルト値:有効化
lk row is hidden 倍長整数 1 対応する行は非表示です。行を非表示にするのはリストボックスでの表示にのみ影響します。非表示の行は配列内には存在し、プログラミングを通して管理可能です。ランゲージコマンド(具体的にはLISTBOX Get number of rowsまたはLISTBOX GET CELL POSITION)は行の表示/非表示のステータスを考慮しません。例えば10行あるリストボックスの、最初の9行が非表示になっていた場合、LISTBOX Get number of rowsは10を返します。ユーザーからの視点では、リストボックス内での非表示行の存在というのは視覚的には認識できません。表示されいている行のみが(例えばすべてを選択コマンドなどで)選択可能です。デフォルト値:表示
lk row is not selectable 倍長整数 4 対応する行は選択可能になっていません(ハイライトができません)。入力可能なテキスト入力エリアは"シングルクリック編集"オプションが有効になっていない限り入力可能ではありません。しかしながらチェックボックスなどのコントロールとリストは機能しています。この設定はリストボックスセレクションモードが"なし"の場合には無視されます。デフォルト値:選択可能

行のステータスを変えるためには、対応する配列の要素に適切な定数を設定するだけです。例えば、10行目を選択不可能に設定したい場合、以下のように書く事ができます:

 aLControlArr{10}:=lk row is not selectable

複数のインターフェースプロパティを同時に定義する事もできます:

要素に対してプロパティを設定すると、(再設定しない限り)その要素の他の値を上書きするという点に注意して下さい。例えば:

 aLControlArr{6}:=lk row is disabled+lk row is not selectable //6行目を無効化しかつ選択不可に設定する
 aLControlArr{6}:=lk row is disabled //6行目を無効化するが選択不可を設定していないので選択が可能となる

リストボックスのプロパティリストで セレクションハイライトを非表示 オプションにチェックを入れている場合(アピアランステーマ の章を参照)には、他のインターフェースオプションを活用してリストボックスの選択行を可視化する必要があります。ハイライトが非表示になっていても選択行は引き続き 4D によって管理されています。つまり:

  • 配列タイプのリストボックスの場合、当該リストボックスにリンクしているブール配列変数から選択行を割り出します。
  • セレクションタイプのリストボックスの場合、特定行 (レコード) がリストボックスの ハイライトセット プロパティで指定しているセットに含まれているかを調べます。

特定された選択行は、それらの背景色やフォントカラー、フォントスタイルなどをプログラムによって調整することで、選択行を独自の方法で可視化することが可能です。リストボックスのタイプによって、表示の管理は配列や式を使用して行います (後述参照)。

注: リストボックスの現アピアランス (フォントカラー、背景色、フォントスタイル等) を使いたい場合には lk inherited 定数が使用できます。lk inherited 定数についての詳細は 継承 の章を参照ください。

行 (レコード) が選択されているかどうかを知るには、リストボックスの ハイライトセット プロパティで指定されているセットに当該行が含まれているかを調べます:

選択されている行のアピアランスを定義するには、プロパティリストに指定する次の式を一つ以上使います:

  • 背景色式 (背景と境界線テーマ)
  • フォントカラー式 (テキストテーマ)
  • スタイル式 (テキストテーマ)

注: 次の場合には式が自動的に再評価されることに留意ください:

  • リストボックスのセレクションが変わった場合
  • リストボックスがフォーカスを得た、あるいは失った場合
  • リストボックスが設置されたフォームウィンドウが最前面になった、あるいは最前面ではなくなった場合

セレクションハイライトを非表示 オプションをチェックした場合には、ブレーク行をハイライトすることができません。

同階層のヘッダーの色は個別指定することができないため、任意のブレーク行だけをプログラムでハイライト表示する方法はありません。

行が選択されているかどうかを知るには、当該リストボックスにリンクしているブール配列変数から選択行を割り出します:

選択されている行のアピアランスを定義するには、プロパティリストに指定する次の配列を一つ以上使います:

  • 行背景色配列 (背景と境界線テーマ)
  • 行フォントカラー配列 (テキストテーマ)
  • 行スタイル配列 (テキストテーマ)

選択行のアピアランスを定義するリストボックス配列は、On Selection Change フォームイベント内で再計算される必要があることに留意ください。また、フォーカスの有無を選択行の表示に反映させるには、次のフォームイベント内でもこれらの配列を変更することができます:

  • On Getting Focus (リストボックスプロパティ)
  • On Losing Focus (リストボックスプロパティ)
  • On Activate (フォームプロパティ)
  • On Deactivate (フォームプロパティ)
例題  

システムのハイライトを非表示にして、リストボックスの選択行を緑の背景色で表しました:

配列タイプのリストボックスの場合、行背景色配列プロパティを更新するために、オブジェクトメソッドを追加する必要があります:

オブジェクトメソッドの例です:

 Case of
    :(FORM Event=On Selection Change)
       $n:=Size of array(LB_Arrays)
       ARRAY LONGINT(_ListboxBackground;$n// 行背景色配列です
       For($i;1;$n)
          If(LB_Arrays{$i}=True// selected
             _ListboxBackground{$i}:=0x0080C080 // 背景色を緑にします
          Else // not selected
             _ListboxBackground{$i}:=lk inherited
          End if
       End for
 End case

セレクションタイプのリストボックスで同じ効果を得るには、ハイライトセットプロパティで指定されたセットに応じて背景色式が更新されるよう、メソッドを利用します:

UI_SetColor メソッドの例です:

 If(Is in set("$SampleSet"))
    $color:=0x0080C080 // 背景色を緑にします
 Else
    $color:=lk inherited
 End if
 
 $0:=$color

警告: ハイライト行を非表示をクリックして、システムハイライトを必ず無効化させて下さい(上記参照)。

SQLクエリーの結果を直接配列タイプのリストボックスに表示することができます。これによりSQLクエリーの結果を素早く見る方法が提供されま す。SELECTタイプのクエリーのみを使用できます。このメカニズムは外部SQLデータベースには使用できません。

この機能は以下の原則に基づいて動作します:

  • クエリーの結果を受け取るリストボックスを作成します。リストボックスのデータソースは配列に設定しなければなりません。
  • SELECTタイプのSQLクエリーを実行し、結果をリストボックスに割り当てた変数に受け取ります。Begin SQL/End SQL キーワードを使用できます (4Dランゲージリファレンス参照)。
  • ユーザーはリストボックス列をソートしたり、更新したりできます。
  • SELECTクエリーを実行するたびに、リストボックス列はリセットされます (複数のSELECTクエリーを実行して、リストボックスに行を追加することはできません)。   
  • SQL クエリーの結果受け取る列数と同じ数の列をリストボックスに用意することを推奨します。SELECTクエリーにより返される列数よりもリストボックスの列数が少ない場合、自動で列が追加されます。SELECTクエリーの結果よりも多い列数がある場合、不必要な列は自動で隠されます。
    注: 自動で追加された列は、 配列型の  にバインドされます。これらのダイナミック配列はフォームが閉じられるまで存在します。またダイナミック変数は各ヘッダー用にも作成されます。LISTBOX GET ARRAYSコマンドが呼び出されると、arrColVars引数にはダイナミック配列へのポインターが、arrHeaderVars引数にはダイナミックヘッダー変数へのポインターが返されます。例えば5つの列が追加されると、5番目の列の配列名はsql_column5でヘッダー名はsql_header5となります。
  • インタープリターモードでは、SQLクエリーにより返されたデータに基づき、自動でリストボックスの既存の配列が型変更される場合があります。


PEOPLEテーブルのすべてのフィールドのデータを取得し、vlistboxという変数名のリストボックスに結果を表示します。これを行うためのメソッドは以下の通りです:

 Begin SQL
    SELECT * FROM PEOPLE INTO <<vlistbox>>
 End SQL



参照 

Customize Highlight Color (4D blog)
Download HDI database
Tutoriaux sur les list box

 
プロパティ 

プロダクト: 4D
テーマ: リストボックス

 
ページの目次 
 
履歴 

変更: 4D v15 R4
変更: 4D v16 R2
変更: 4D v17

 
ARTICLE USAGE

ランゲージリファレンス ( 4D v20 R7)