Tips

リストボックスで行をハイライトして、さらにハイライトした行を表示する

日付2018/04/25
ID18-003
バージョンv12以降
プラットフォームWindows, Mac

リストボックスの行をメソッドでハイライト(選択)したとき、HIGHLIGHT RECORDS コマンドで選択しただけでは、スクロールしないとハイライト行が見えないことがあります。そのようなときには、OBJECT SET SCROLL POSITION コマンドを使ってハイライト行が見えるようにスクロースさせます。

配列タイプのリストボックスの場合、ハイライト行はリストボックスに関連付けしたブール配列に得られるので、どの行がハイライトされているか直接的に参照できますので、容易に OBJECT SET SCROLL POSITION コマンドを利用できます。

セレクションタイプの場合、ハイライトされている行は、ハイライトセットで表現されています。セットで表現されたレコードは、セレクションとは別の集合なので、セレクション中のどこに表示されているかセットから位置を判読できません。OBJECT SET SCROLL POSITION コマンドを利用するためには、なんとかして何行目がハイライトされているかを突き止めることになります。

そこで思いつく方法は…

  1. セレクションをループしてハイライトセットに含まれるかを調べる
  2. ハイライトに利用したフィールドをセレクションから配列化して配列内の位置を調べる
…などが考えられます。

例題:セレクションをループしてハイライトセットに含まれるかを調べる

$listbox:="List Box"//リストボックスの名前
LISTBOX GET TABLE SOURCE(*;$listbox;$table_num;$name;$highlightName)
$table:=Table($table_num)

LOAD RECORD($table->)//プロジェクトフォームで表示されている時でカレントレコードを退避するなら
PUSH RECORD($table->)//カレントレコードを退避(必要なら)
FIRST RECORD($table->)
Repeat 
If (Is in set($highlightName))
OBJECT SET SCROLL POSITION(*;$listbox;Selected record number($table->))
LAST RECORD($table->)
End if 
NEXT RECORD($table->)
Until(End selection($table->))
POP RECORD($table->)//カレントレコードを復帰(必要なら)

例題:ハイライトに利用したフィールドをセレクションから配列化して位置を調べる

$listbox:="List Box"
$field:=->[table]field
$key:="検索に利用した値"

SELECTION TO ARRAY($field->;$field_arr)
$raw:=Find in array($field_arr;$key)
OBJECT SET SCROLL POSITION(*;$listbox;$raw)