リストボックスのソート順を保持する

4Dの配列型リストボックスにはタイトル行をクリックするとその列でソートされる、という便利な機能がある。

列名の横に「^」マークがついているのがソートされている列

ユーザがこの機能を使ってソートした後で、上から順番に行をダブルクリック、編集フォームを表示、内容を編集してAcceptで戻ってきたとき、修正された内容をDBに保存する、というオペレーションがあるとしよう。この時、リストボックスの表示は、DBに保存するたびにリスト全体の値を取得し直して更新することになる。編集内容によっては並び順が変わることもある。

ここで問題になるのがソート順。何らかの方法で、ユーザクリックによるソート順を保持している必要がある。レコード更新によって単純に値を取り直してデフォルトのソート順で並べてしまうと、とても使いにくいアプリになる。上記のように上から順番に編集していくような場合は特にそうだ。ユーザはタイトル行をクリックし直してソート順を回復しなくてはならなくなる。

ウチでは、JCL4Dの次のようなコマンドセットを使ってこの問題に対処している。

JCL_lst_Sort
JCL_lst_Sort_Append
JCL_lst_Sort_AppendCurrent

使い方は次の通り。

1.フォームがロードされたとき(OnLoad)
プロセス変数を宣言、初期ソート対象の列名をソート用配列にアペンド。JCL_lst_Sort_Append

2.リストボックスのヘッダ行がクリックされてソートされたとき
クリックされた列名をソート用配列にアペンド。JCL_lst_Sort_AppendCurrent

3.リストボックスの配列を再作成するとき
保持していたソート順を配列数の数だけ連続実行。JCL_lst_Sort

実装箇所は次の5箇所

・フォームプロセス変数を宣言しているメソッド:xx01_frmDefInit

  //KN01_frmDefInit
...

  // ソート順を覚えるため
ARRAY TEXT(vKN01_lstKN_HeaderNames;0)
ARRAY LONGINT(vKN01_lstKN_SortOrders;0)

・フォームのオンロードメソッド:xx01_frmOnLoad

  //KN01_frmOnLoad
...
  // デフォルトの並び順を指定、配列にプッシュしておく
JCL_lst_Sort_Append ("vKN01_lstKN";->vKN01_lstKN_HeaderNames;->vKN01_lstKN_SortOrders;1;2)  // 降順
JCL_lst_Sort_Append ("vKN01_lstKN";->vKN01_lstKN_HeaderNames;->vKN01_lstKN_SortOrders;2;1)  // 昇順

・リストボックスのオブジェクトメソッド:xx01_lstXX_OnAfterSort

  //KN01_lstKN_OnAfterSort
  //ソート後に取得で、ソート履歴に一つ追加

JCL_lst_Sort_AppendCurrent (->vKN01_lstKN;->vKN01_lstKN_HeaderNames;->vKN01_lstKN_SortOrders)

・リストボックスの配列を作成しているメソッド:xx01_lstXX_make

  //KN01_lstKN_Make
  //Z_KeyNValue リストボックス配列作成
...
  // ソート順を実行
JCL_lst_Sort ("vKN01_lstKN";->vKN01_lstKN_HeaderNames;->vKN01_lstKN_SortOrders)

上記のコーディングパターンについては「4Dアプリ開発ガイド」を参照。