Formula コマンドは、 4D v17 R3 から利用できます。これまでは、数式をメソッドとしてオブジェクトに割り当てたり、値の計算や必要なことを行うことができるスマートオブジェクトを構築することを考えてきたかもしれません。これは本当に素晴らしいことで、見た目以上の効果がありますよ。
Vincent de Lachaux – Developer and expert 4D –から、このコマンドをどのように使うか、素晴らしいデモンストレーションを受けました。このブログでは、そのデモの中から、このコマンドの異なる側面についての洞察を得るために、異なるシナリオをまとめました。
例1:既存のコマンドを簡略化する
4Dコマンドの中には、コードの中で何十万回も使用されるものがあります。1つを除いて同じパラメータを渡すことがよく あります。
簡単な例として、 のコマンドを考えてみましょう。チェックボックスの値を初期化したいので、こう書きます。OBJECT get pointer
(OBJECT get pointer(Object named; "checkbox"))->:=0
あるいは、オブジェクトの名前をパラメータとする数式を書きます。
interfaceポインタ:=Formula(OBJECT Get pointer(Object named;$1))
チェックボックスの値を代入したり、取得したりするときは、次のように書けばよい。
(interface.pointer("checkbox"))->:=0
(interface.pointer("checkbox2"))->:=0
また、何千ものチェックボックスを設定する必要がある場合は、数式を作成して簡略化することができます。
interface.setCheckbox:=Formula((OBJECT Get pointer(Object named;$1))->:=$2)
一連のチェックボックスを設定するには、次のように書けばよい。
interface.setCheckbox("checkbox1";0)
interface .setCheckbox("checkbox2";1)
interface .setCheckbox("checkbox3";0)
interface .setCheckbox("チェックボックス4";1)
読みやすくなったし、括弧を数える必要がなくなったので、書くのも楽になった。
例 2 – データベースパラメーターを使用する場合
コードの中で、同じデータベース・パラメータを何度も異なる値で設定してみよう。具体的な例として、ディレイコントロールのヒントを考えてみよう。フォームのある部分ではヒントを遅延させずに表示し、別の部分では1秒待つようにしたい場合があります。データベースパラメータを使うたびに、その値を覚えておくか、別のコードでその値を探さなければなりません。
なぜ数式を作らないのでしょうか?
interface.tipsNoDelay:=Formula(SET DATABASE PARAMETER(Tips delay;1))
interface .tips1sDelay:=Formula(SET DATABASE PARAMETER(Tips delay;60)
)
そして、値を変えたいときは、その数式を呼び出せばいいのです。
interface.tips1sDelay()
// or
interface .
tipsNoDelay()
例 3 – 数式をバリアントとして使用する
メソッドのパラメータとして渡された値(すなわち$1, $2) を使用する数式を作成できますが、数式を作成するメソッドでは $1 と $2 を入力する必要はありません。 変数は数式が実行されるときに入力されます。一般的なメソッドや数式を書くことができます。
以下は、実行時に型が定義されることを示す簡単な例です。
$obj:=New object("加算";Formula($1+$2))
$number :=$obj.addition(1;2) // 3を返す
$text :=$obj.addition("hello "; "world") // hello worldを返す
例4 – 一連の条件をテストする
If (() & ()) のような一連の条件を作ると、4Dは常にすべての条件を評価します。次の条件も評価し続けます。もし、いくつかの条件が、左端が真である場合にのみ評価される場合、属性をテストする前にオブジェクトが有効であるかどうかをチェックするために、深いネストされたif条件のリストを作成することを余儀なくされます。このような感じです。
If ( ( ( )) ( . # ) ( . <5) NotUndefined$o
If$ovalueNull
If$ovalue
// to do
End if
End if
End if
この例では、3つの条件「だけ」でしたが、だんだん複雑になっていくのがすぐわかりますね。では、すべてを1つの条件にしてみたらどうでしょう。数式を次々と実行するメソッドを書いてみてはどうでしょうか。結果がTrueなら次の式を評価し、Falseなら中止してFalseを返します。
If ( (\ ( ( ( )));\ ( . # );\ ( . <5)\ ) )_AND
)
FormulaNotUndefined$o
Formula$ovalueNull
Formula$ovalue
// to do
End if
_AND の場合は、ごく普通の簡単なコードです。
$0:=True
For ($i;1;Count parameters;1)
$0 :=${$i}.call()
If (Not($0))
$i :=MAXLONG-1// Stop if the condition fails
End if
End for
これらの例が、このコマンドの他の使用方法についてのヒントになれば幸いです。4D フォーラムであなたの数式を自由にシェアしてください…。きっとたくさんのアイディアがあるはずです。