ここは旧式の4DドキュメントWebサイトです。最新のアップデートされたドキュメントを読むには新サイトをご利用下さい→ developer.4d.com |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v20 R7
リストボックスオブジェクトの管理
|
イベント | フォーカスのあるオブジェクト | カレントのオブジェクト |
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 Detail | Nil | リストボックス (**) |
On Close Detail | Nil | リストボックス (**) |
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は以下を返します:
OBJECT SET SCROLL POSITION コマンド("オブジェクトプロパティ"テーマ)をリストボックスで使用できます。スクロールは、リストボックスの最初に選択された行または指定された行を表示させます。
EDIT ITEMコマンド("入力制御"テーマ)を使用して、リストボックスオブジェクトのセルを編集モードに移行することができます。
REDRAW コマンド("ユーザーインターフェース"テーマ)をリストボックスのセレクションモードに対して適用した場合、コマンドはリストボックス内に表示されているデータの更新を実行します。
注: REDRAW コマンドはエンティティセレクション型のリストボックスではサポートされていません。
Displayed line number コマンド (“” テーマ) はリストボックスオブジェクトのOn Display Detail フォームイベントのコンテキストで動作します。
リストボックス管理、特にドラッグ&ドロップや並び替え操作を管理するために、特別なフォームイベントを使用できます。詳細については、Form Eventコマンドの節を参照してください。
リストボックス中でのデータのドラッグ&ドロップ管理は、Drop position と DRAG AND DROP PROPERTIESコマンドでサポートされます。これらのコマンドは特にリストボックスに適用されます。
行や列のドラッグ&ドロップと混同しないように注意してください。これらはLISTBOX MOVED ROW NUMBER や LISTBOX MOVED COLUMN NUMBER コマンドでサポートされます。
リストボックスセルを入力可能にするには、以下の条件を満たす必要があります:
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 イベントの場合:
注: コレクション/エンティティセレクション型では、式がnull に評価される場合にリストボックスでのデータ入力に制約があります。この場合、セル内のnull 値を編集あるいは削除することはできません。
ヘッダがクリックされると、デフォルトでリストボックスは自動的に標準的なカラムの並び替えを行います。標準的な並び替えとは、列の値を文字順に並べ替え、続けてクリックされると昇順/降順を交互に切り替えます。すべての列は常に自動で同期されます。
リストボックスの並び替え可プロパティの選択を解除すると、ユーザによる標準の並び替えを禁止することができます。
開発者は、LISTBOX SORT COLUMNSコマンドを使用するか、またはOn Header ClickとOn After Sortフォームイベント (Form eventコマンドの節を参照) と4Dの配列管理コマンドを組み合わせて、独自の並び替えを設定することができます。
Note: 列のプロパティ"並び替え可"は、ユーザによる標準の並び替えにのみ影響を与えます。LISTBOX SORT COLUMNSコマンドでは、このプロパティが考慮されません。
列ヘッダに関連付けられた変数の値を使用すると、列の現在の並び替え状況(読み込み)や並び替え矢印の表示など、追加情報を管理することができます。
変数の値を設定して (例えばHeader2:=2)、ソートを表す矢印の表示を強制することができます。しかし列のソート順は変更されません、これを処理するのは開発者の役割です。On Header Clickイベントにともなうソート処理と並び替え矢印の管理をオブジェクトメソッドにて行う場合には、戻り値に「-1」を返すとヘッダーの自動アクションを阻止できます。
選択行の管理は、リストボックスのタイプが配列か、レコードのセレクションか、あるいはコレクション/エンティティセレクションかによって異なります。
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 コマンドを使用してオブジェクトの印刷を制御できます。
このモードでは:
リストボックスの背景色、フォントカラー、そしてフォントスタイルを設定するためにはいくつかの方法があります:
優先順位と継承の原理はそのままです。
同じプロパティに異なる値が複数のレベルにわたって適用された場合、以下の優先順位が適用されます:
優先度高 | セル単位(マルチスタイル使用時) |
列の配列/メソッド | |
リストボックスの配列/メソッド | |
列のプロパティ | |
リストボックスのプロパティ | |
優先度低 | メタ情報式(コレクションあるいはエンティティセレクション型リストボックスの場合) |
例として、リストボックスのプロパティにてリストボックスにフォントスタイルを設定し、列のスタイル配列を使用して列に対して異なるスタイルを設定した場合、後者の方が有効となります。
以下の様な、グレー/淡いグレーを交互に繰り返す行の背景色がリストボックスのプロパティで定義されたリストボックスについて考えます。同時に、行の中の少なくともどれか一つの値が負の値である行に関しては背景色がオレンジ色になるような背景色配列が設定されていたとします:
<>_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 (デフォルト値) を渡すか、対応するスタイル/カラー配列の要素の中に直接渡して下さい。
以下の様な、標準のフォントスタイルで行の背景色が交互に変わるリストボックスを考えます:
以下の様な変更を加えます:
リストボックスを元の状態に戻すには、以下の手順で元に戻せます:
配列型のリストボックス内にて、それぞれの行に対して"非表示"、"無効化"、"選択可能"のインターフェースプロパティを設定する事ができます。
この設定は、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{8}:=lk row is not selectable+lk row is disabled
要素に対してプロパティを設定すると、(再設定しない限り)その要素の他の値を上書きするという点に注意して下さい。例えば:
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 フォームイベント内で再計算される必要があることに留意ください。また、フォーカスの有無を選択行の表示に反映させるには、次のフォームイベント内でもこれらの配列を変更することができます:
システムのハイライトを非表示にして、リストボックスの選択行を緑の背景色で表しました:
配列タイプのリストボックスの場合、行背景色配列プロパティを更新するために、オブジェクトメソッドを追加する必要があります:
オブジェクトメソッドの例です:
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データベースには使用できません。
この機能は以下の原則に基づいて動作します:
例
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
ランゲージリファレンス ( 4D v20 R7)