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

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)