コレクションのメンバー関数がコールバックを必要とする場合に、もっとわかりやすい方法はないかとのご要望を多数いただきました。
この度、このご要望に応えることができました!
4D v19 R6 より、コレクションのメンバー関数に定義するコールバックのほか、EXECUTE METHOD IN SUBFORM、CALL FORM および CALL WORKER コマンドにもフォーミュラが受け渡せるようになりました。もし、コードを簡単な式に減らすことができれば、メソッドを使用せずに直接受け渡すこともできます。
COLLECTIoN とフォーミュラ
次のメンバー関数でコールバックとしてフォーミュラを使用できるようになりました: .every(), .filter(), .find(), .findIndex(), .map(), .orderByMethod(), .reduce(), .some(), .sort()
たとえば、コレクションで 0 より大きい要素をすべて見つけたい場合、1行でそれをおこなうことができます:
$result:=$c.filter(Formula($1.value>0))
上記のように、よりシンプルで読みやすくするため、$1.result はフォーミュラで省略可能です。
もちろん、次のようなコードを使用することもできます:
$c:=New collection
$c.push(1;-5; -3; -1;3; -4; -6; -2;10)
$result:=$c.filter("NumberGreaterThan0")
しかし、フォーミュラを使ってメソッドを参照することで、コード補完機能を活用してメソッド名を見つけられるほか、メソッド名を変更した場合にコード内の参照箇所を自動変更してくれる機能を利用することができます:
$c:=New collection
$c.push(1;-5; -3; -1;3; -4; -6; -2;10)
$result:=$c.filter(Formula(NumberGreaterThan0))
この場合、NumberGreaterThan0 メソッドは下のように書けます:
#DECLARE ($param:Object)
$param.result:=$param.value>0
コマンドとフォーミュラ
EXECUTE METHOD IN SUBFORM、CALL FORM および CALL WORKER コマンドのコールバックを定義するのにもフォーミュラを使用できます。
コレクションの場合と同様に、メソッドを作成しなくてもフォーミュラは利用可能です:
// フォームのコンテキスト内のウィンドウを閉じます
CALL FORM($windows;formula(CANCEL))
または、次のいずれかの方法でメソッドを参照します:
EXECUTE METHOD IN SUBFORM("Subform"; Formula(UpdateField))
あるいは
EXECUTE METHOD IN SUBFORM("Subform"; "UpdateField")
これらの新機能を HDI で試してみてください。
フィードバックはぜひフォーラムにお寄せください。