サブフォームで選択されたレコードのフィールドを取得できないのですが
サブフォームで選択されたレコードについては、必ずカレントレコードとなる保証がないので、プログラムでフィールドの値を取り出さなくてはなりません。
4D 2003以前のバージョン
4Dのユーザインターフェースにおいて、サブフォームで表示されたテーブルのカレントレコードについては何の保証もありませんでした。一方ほとんどの場合、サブフォーム上で最後にハイライトされたレコードがカレントレコードになるので、参照する事ができるかのように思えました。
しかし、そのような仕様は存在しませんでした。つまり、明示的にプログラムされていない4Dのサブフォームのカレントレコードは当てにするべきではないのです。言い換えるなら、4D 2003以前のバージョンでは、選択したレコードを取得する計画な方法はありませんでした。
4D 2004
サブフォームで表示されたテーブルのカレントレコードを利用するべきではない点においては、4D 2004でも同じです。もちろんプログラムでカレントレコードを明示的に指定した場合には問題ありませんが、ユーザがクリックしたレコードを取得するために暗示的なカレントレコードを利用することはできません。しかし仕様に添って確実にユーザがクリックしたレコードを取得する方法があります。
4D 2004では、リストフォームの動作が統一されました。そのためサブフォームにおいてもハイライトされたレコードを取得することができるようになりました。
これによりユーザがクリックした、つまりハイライトされたレコードを取得するために、GET HIGHLIGHTED RECORDSを使い取得することができるようになりました。
GET HIGHLIGHTED RECORDSは4D 2004で追加されたコマンドです。つまり4D 2004からは、サブフォーム上のハイライトされたレコードを特定できるようになったのです。
サブフォームとGET HIGHLIGHTED RECORDS
GET HIGHLIGHTED RECORDSをサブフォームで利用するためには、条件があります。このコマンドを正しく使うためには、サブフォームのプロパティ「選択モード」が「複数」でなければなりません。もし1行だけ選択可能にして、その選択レコードのフィールド値を取得することが目的ならば、サブフォームに連結したフォームメソッドで1行しか選択できないようにプログラムする必要があります。
こうした仕様に従って、選択モードが「複数」でありながらも「単一」選択のように振る舞い、正しくカレントレコードをロードするプログラムを考えてみました。次のプログラムは、サブフォームに組み込むフォームのフォームメソッドに記述します。
このプログラムによって、サブフォームをクリックした時に確実に選択されたレコードをカレントレコードとしてロードする事が可能になりました。
しかし、それでも問題は残ります。
4D自身が行う再描画動作との衝突を避ける
4Dは隠れたウィンドウが表示された時など、ウィンドウを再描画します。そのとき、サブフォームで表示されているテーブルを再描画するために、カレントレコードを操作します。それがカレントレコードが行方不明になる現象の理由です。
カレントレコードが保証されているのは、メソッドが起動されて終了するまでの間に限られます。また入力フォームとして表示されているレコードは、唯一ユーザインターフェースとして保証されたカレントレコードです。ですから、サブレコードの値を継続して表示したり使う場合には、再描画動作を考慮しなければなりません。例えば下図のようなインターフェースで確実に選択中のレコードの値を取り出して表示しておくためには、サブフォーム上のレコードがクリックされた時に変数フィールドに取り出して表示するような工夫が必要になります。
まとめ
これまでのバージョンではサブフォームの仕様が明確ではなかったために、仕様として定められていなかった動作を期待してプログラムする等の工夫で切り抜けて行かなければなりませんでした。しかし、仕様として明確になった現在、この仕様に従ってプログラムできるようになりました。