4D v14.3

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

ホーム

 
4D v14.3
リストボックスオブジェクトの管理

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


 

 

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

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

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 ROWLISTBOX DELETE ROW コマンドを使用できないことに留意してください。

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

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

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

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


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

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

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

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

オブジェクトプロパティコマンドオブジェクト列ヘッダー列フッター
OBJECT MOVEO
OBJECT GET COORDINATESO
OBJECT SET RESIZING OPTIONS O
OBJECT GET RESIZING OPTIONS O
OBJECT SET FILTERO
OBJECT SET FORMATOO
OBJECT SET ENTERABLEO
OBJECT SET CHOICE LIST NAMEO
OBJECT SET TITLEO
OBJECT SET COLOROOOO
OBJECT SET RGB COLORSOOOO
OBJECT SET FONT OOOO
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 GET BEST SIZEOOO

: 配列型のリストボックスではスタイル、フォントカラー、背景色、行ごとの表示を個別に指定できます。これはリストボックスのプロパティリストを使用して関連付けた配列を通して行います。これらの配列名は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)、ヘッダー変数、またはフッター変数へのポインターを返します。以下の表に動作をまとめます:

イベントObject with focusObject current
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は以下を返します:

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

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

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

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より前に生成されます。

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

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

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

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

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

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

変数の値を設定して (例えばHeader2:=2)、ソートを表す矢印の表示を強制することができます。しかし列のソート順は変更されません、これを処理するのは開発者の役割です。

選択行の管理は、リストボックスのタイプが配列かセレクションかにより異なります。

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

: Count in arrayコマンドを使用して、選択された行の数を調べることができます。

例えば、以下のメソッドは配列タイプのリストボックスで、最初の行の選択を切り替えます:

  ` 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コマンドで取得できます。
  • リストボックスオブジェクトは"そのまま"印刷されます。言い換えれば、ヘッダーやグリッド線の表示、表示/非表示行など、現在の表示パラメタが考慮されます。
    これらのパラメタには印刷される最初の行も含みます。印刷を実行する前にSCROLL LINESを呼び出すと、リストボックスに印刷される最初の行はコマンドで指定した行になります。
  • 自動メカニズムにより、表示可能な行以上の行数を含むリストボックスの印刷が容易になります。連続して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 コマンドを使用しても同じ結果を得ることができます。こちらを使った方がコマンドが動的に配列を作成するので、列ごとのスタイル/カラー配列を事前に設定するのをスキップすることが出来るという利点があります。

継承  

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

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

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

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

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

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

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

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

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

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

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


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

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

 
プロパティ 

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

 
参照 


階層リストボックスの管理

 
ARTICLE USAGE

ランゲージリファレンス ( 4D v14 R3)
ランゲージリファレンス ( 4D v14 R2)
ランゲージリファレンス ( 4D v14.3)
ランゲージリファレンス ( 4D v14 R4)

Inherited from : リストボックスオブジェクトの管理 ( 4D v13.5)