4Dのリストボックスから開いたフォームに、「次前(つぎまえ、と読む)」を実装する
リストボックスの選択行の詳細を表示した時、次のレコードに移動するには、一度フォームを閉じてリストボックスに戻り、次の行をダブルクリックなどでレコードを表示する。これではユーザは不便。それでフォームに[次][前]ボタンを配置して、リストボックスに戻らなくても隣のレコードを表示できるように、という要望にお応えするのだ。
実装方法
たとえばvKA01_lstKAというリストボックスがある。キー配列はvKA01_lstKA_IDとすると、次前はこのvKA01_lstKA_IDの配列中から隣のKA_IDを取得して、そのレコードをロードして表示する、ような実装をする。これでリストボックスに表示されているレコードを行ったり来たりする動きになる。
実装箇所
修正が必要なのは次の箇所。
1)フォームに◁▶︎のようなボタンと現在の位置を2/30のような形式で表示するテキストが必要
![](http://jiro2012.sakura.ne.jp/wt/wp-content/uploads/2020/01/6f59e9321fd3ad68172a8faae1051eff-1024x117.png)
2)呼び出し元、たぶんKA01_btnModのようなボタンメソッド
次前しなければ$ka_idは変更されない値だったが、次前を実装するとフォームが閉じた時に変化していることがある。選択されている行番号も同様だ。戻ってきた時、最後に選択されているはずの行の内容を保存したり、リストボックスでその行を選択したりするために、フォームで次前が行われた結果の$ka_idと行番号を返してもらう必要がある。よってこれらはポインタで渡す。引数は次の3つ。
- $ka_idのポインタ
- 配列vKA01_lstKA_IDのポインタ
- 選択されている行番号のポインタ
![](http://jiro2012.sakura.ne.jp/wt/wp-content/uploads/2020/01/79b9ef4b903b2b4b43db55fbaf3403f5-1024x985.png)
3)呼び出される側、KA02_Input_Mod
KA02_Displayする前に、配列のポインタ、行番号、$ka_idをプロセス変数に保持、ゲッターセッターを用意。_DisplayでOKされたら、フォームを表示する前のKA_IDと閉じた時のKA_IDは次前で変化している可能性があるため、Acceptの際にゲッターでKA_IDを取得してからレコードを保存する。リストを再作成してから、変化した行番号をゲッターで取得してリストボックスの行を選択し直す。
![](http://jiro2012.sakura.ne.jp/wt/wp-content/uploads/2020/01/9519a907c0c92909fe3dcec6351abdf0-791x1024.png)
4)一番前に来たら前ボタン、一番後ろに来たら次ボタンをディスエイブルにするために、SetControlsValuesにSetControlsValues_PrevNextを追加
![](http://jiro2012.sakura.ne.jp/wt/wp-content/uploads/2020/01/a7a854a7edce2ccba31aada0e21627d8-1024x648.png)
5)次前ボタン(KA02_brnNext)
次前の際に、レコードを保存するかどうかは設計が必要だ。次のようなケースがある。
- A)問答無用で保存(いわゆる自動保存)
- B)問答無用でキャンセル(保存しない、変更内容は失われる)
- C)変更していたら自動保存、変更していなければ保存しない
- D)変更していたらアラートでお知らせしてから保存、変更していなければアラートせずに保存しない
理想を言えばDだが、Aでも成立するケースは多い。ユーザからの強い要望でBというケースもあったので決めつけることのないように。次の実装はAの自動保存。
![](http://jiro2012.sakura.ne.jp/wt/wp-content/uploads/2020/01/f7ec60b88e6337ebeacf3181b5f456a3-892x1024.png)
ネーミングおよびJCL4Dについては「4Dアプリ開発ガイド」を参照。