4D v18で変わった「Form event」コマンド

「4Dアプリ開発ガイド v18対応版」を制作していたらコマンドの仕様変更に気づいたので報告する。これまでに気づいているのは次の2つ、「FORM Event」と「PAGE SETUP」。

FORM Event

フォームイベントコマンドの仕様が変わった。以前は次のように記述していた。

//A02_frm
// オンロードメソッド
Case of
: (Form event=On Load)
A02_frmOnload
End case

このコードをv18にペーストして実行すると、次のようなエラーになる。

関数の結果が式と一致しません。定数のタイプが無効です。変数のタイプが異なるため比較できません。

ランゲージリファレンスを見ると、v18では戻り値がオブジェクト型になっていた。

https://doc.4d.com/4Dv18/4D/18.4/FORM-Event.301-5233147.ja.html

v15とかv17のプロジェクトをv18に変換すると、次のようなコードに変換される。

//A02_frm
// オンロードメソッド
Case of
: (Form event code=On Load)
A02_frmOnload
End case

「Form event」コマンドは「Form event code」に変更されて、オブジェクト型を返す「FORM Event」が新しく追加された、ということらしい。従来取得していた整数型のイベントコードは「code」というフィールドに格納されている。もともとコードしか返さなかったを、イベントのトリガーとなったオブジェクト名も返すようだ。いいかもしれない。これまでイベントハンドラはオブジェクトメソッドに書いていたが、フォームメソッドにまとめて書いて、「もしこのオブジェクト名だったら」という記述ができるようになったってことかな。

発生したcodeだけを必要とする場合はどちらのコマンドを使っても同じみたいだけど、オブジェクト型を使ってドット表記を参照する方が流行りっぽくてかっこいいかもしれない、とか色々考えて次のようにした。

//A02_frm
//オンロードメソッド
C_LONGINT($frmEvnt)
$frmEvnt:=FORM Event.code
Case of
: ($frmEvnt=On Load)
A02_frmOnLoad
End case

修正ついでに一旦ローカル変数に取得するようにした。これでデバッグしやすくなる。Case文に何回も書くと、その数だけFORM Eventが実行されてしまい、気づかれるほどではないにしても性能的によろしくないので。

PAGE SETUP

廃止になった。プロジェクトをv18に変換すると、次のようなコードに変換されている。

_O_PAGE SETUP

代わりのコマンドが用意されていて、SET PRINT OPTION/GET PRINT OPTION、Print settings to BLOB/BLOB to print settingsを使う、とランゲージリファレンスに書いてある。

https://doc.4d.com/4Dv18R5/4D/18-R5/o-PAGE-SETUP.301-5128159.ja.html

もともと「PAGE SETUP」は、印刷ダイアログを表示することなく、用紙とか印刷設定を前回と同様またはいつも決まった所定のセッティングで印刷したいときに使うコマンドであった。ユーザが毎回印刷設定ダイアログで設定してから印刷する場合は不要だが、印刷設定ダイアログを出さずに印刷したり、前の設定を覚えておいて欲しい場合に実装することになる。v18ではまだそのような仕様を使う状況に遭遇していないので、使うことになったらまた報告する。