4D v16.3リストボックスオブジェクトの管理 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v16.3
リストボックスオブジェクトの管理
|
イベント | Object with focus | Object 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 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コマンド ("ユーザーインターフェーステーマ") がセレクション表示モードのリストボックスに適用されると、コマンドはリストボックス中に表示されたデータの更新を実行します。
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 saving an existing record トリガーが設定されていれば、コールされます)、その後 On Data Change イベントが実行されます。典型的なデータ入力・編集操作にともなって発生するイベントシーケンスは次のようになります:
アクション | イベントシーケンス |
セルが編集モードに切り替わったとき | On Before Data Entry / On Getting Focus |
セルの値が編集されたとき | On Before Keystroke / On After Keystroke / On After Edit |
ユーザーによってセルが確定され、(タブキー、クリック操作などで) セルを移動したとき | 保存 (On saving an existing record トリガー) / On Data Change / On Losing Focus |
ヘッダがクリックされると、デフォルトでリストボックスは自動的に標準的なカラムの並び替えを行います。標準的な並び替えとは、列の値を文字順に並べ替え、続けてクリックされると昇順/降順を交互に切り替えます。すべての列は常に自動で同期されます。
リストボックスの並び替え可プロパティの選択を解除すると、ユーザによる標準の並び替えを禁止することができます。
開発者は、LISTBOX SORT COLUMNSコマンドを使用するか、またはOn Header ClickとOn After Sortフォームイベント (Form eventコマンドの節を参照) と4Dの配列管理コマンドを組み合わせて、独自の並び替えを設定することができます。
Note: 列のプロパティ"並び替え可"は、ユーザによる標準の並び替えにのみ影響を与えます。LISTBOX SORT COLUMNSコマンドでは、このプロパティが考慮されません。
列ヘッダに関連付けられた変数の値を使用すると、列の現在の並び替え状況(読み込み)や並び替え矢印の表示など、追加情報を管理することができます。
変数の値を設定して (例えばHeader2:=2)、ソートを表す矢印の表示を強制することができます。しかし列のソート順は変更されません、これを処理するのは開発者の役割です。On Header Clickイベントにともなうソート処理と並び替え矢印の管理をオブジェクトメソッドにて行う場合には、戻り値に「-1」を返すとヘッダーの自動アクションを阻止できます。
選択行の管理は、リストボックスのタイプが配列かセレクションかにより異なります。
注: 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 コマンドを使用してオブジェクトの印刷を制御できます。
このモードでは:
リストボックスの背景色、フォントカラー、そしてフォントスタイルを設定するためにはいくつかの方法があります:
優先順位と継承の原理はそのままです。
同じプロパティに異なる値が複数のレベルにわたって適用された場合、以下の優先順位が適用されます:
優先度高 | セル単位(マルチスタイル使用時) |
列の配列/メソッド | |
リストボックスの配列/メソッド | |
列のプロパティ | |
優先度低 | リストボックスのプロパティ |
例として、リストボックスのプロパティにてリストボックスにフォントスタイルを設定し、列のスタイル配列を使用して列に対して異なるスタイルを設定した場合、後者の方が有効となります。
以下の様な、グレー/淡いグレーを交互に繰り返す行の背景色がリストボックスのプロパティで定義されたリストボックスについて考えます。同時に、行の中の少なくともどれか一つの値が負の値である行に関しては背景色がオレンジ色になるような背景色配列が設定されていたとします:
<>_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行目を無効化するが選択不可を設定していないので選択が可能となる
SQLクエリーの結果を直接配列タイプのリストボックスに表示することができます。これによりSQLクエリーの結果を素早く見る方法が提供されま す。SELECTタイプのクエリーのみを使用できます。このメカニズムは外部SQLデータベースには使用できません。
この機能は以下の原則に基づいて動作します:
例
PEOPLEテーブルのすべてのフィールドのデータを取得し、vlistboxという変数名のリストボックスに結果を表示します。これを行うためのメソッドは以下の通りです:
Begin SQL
SELECT * FROM PEOPLE INTO <<vlistbox>>
End SQL
プロダクト: 4D
テーマ: リストボックス
変更: 4D v15 R4
ランゲージリファレンス ( 4D v16)
ランゲージリファレンス ( 4D v16.1)
ランゲージリファレンス ( 4D v16.2)
ランゲージリファレンス ( 4D v16.3)