私はJCLの式評価ツールTEvaluator(barry kellyによって寄贈された素晴らしい創造物)を使用しています。 (お客様にバリーをありがとう!)私はAddFuncメソッドを使用しましたはJCLのTEvaluatorへの面白い呼び出しを助ける必要があります
背景。
function MyFunc:double;
begin
// calculations here
Result:=1;
end;
あなたが機能を利用できるようにAddFuncメソッドを使用することができます。ここ
AddFunc('MyFunc', MyFunc);
が問題だ...
は、私が代わりにAのオブジェクトのメソッドを呼び出す必要がありますスタンドアロンルーチン。
私は値を提供するオブジェクトのリストを持っているからです。
車両オブジェクトのリストがあります。各オブジェクトには重み関数があります。私は、各オブジェクトの重みを公式で使用できるようにしたいと考えています。
愚かな例が、説明するのは簡単です:
type
TVehicle=class
private
public
function Weight:double;
end;
function StrangeCalculation:double;
var
vehicle:TVehicle;
begin
for iVehicle = 0 to Count - 1 do
begin
vehicle:=GetVehicle(iVehicle);
// E2250 There is no overloaded version of 'AddFunc' that can be called with these arguments
eval.AddFunc(vehicle.Name, vehicle.Weight);
end;
Result:=eval.Evaluate('JeepTJWeight + FordF150Weight * 2');
end;
私のオプション:
AddVar()またはAddConst() - しかし、私ので、それはとても素晴らしいではありません値が利用できない場合には例外を発生させる必要があります。
スタンドアロン機能を持つAddFunc()。ランタイムまで変数名(および変数の数)が不明であるため、実行できません。
変数が見つからない場合は、コールバックを追加するようにオブジェクトを変更します。私は実際にこれを行ったが、これを行うためにコールバックするためにソースのコピーを編集する必要があった。
メソッドファンクションを使用できるAddFunc()を作成します。
オプション#3は実際には作成されますが、追加のAddFuncはより良いでしょう。問題は私が提供するどのようなメソッドのプロトタイプを知らないです。私はTMethodが方法かもしれないと思ったが、私の知識はここではあまりにも限定されている...ここで私の失敗の試みだったが、私はまだ "E2250を取得する"これらの引数で呼び出すことができる 'AddFunc'のオーバーロードされたバージョンはない "eval.AddFunc以前と同じように()呼び出し。
TFloat64MethodFunc = function(c:pointer): TFloat64;
procedure TEasyEvaluator.AddFunc(const AName: string; AFunc: TFloat64MethodFunc);
begin
FOwnContext.Add(TExprFloat64MethodFuncSym.Create(AName, AFunc));
end;
TExprFloat64MethodFuncSym = class(TExprAbstractFuncSym)
private
FFunc: TFloat64MethodFunc;
public
constructor Create(const AIdent: string; AFunc: TFloat64MethodFunc);
function Evaluate: TFloat; override;
// not using function Compile: TExprNode; override;
end;
ありがとうございました!
MP