2009-03-27 5 views
3

私は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; 

私のオプション:

  1. AddVar()またはAddConst() - しかし、私ので、それはとても素晴らしいではありません値が利用できない場合には例外を発生させる必要があります。

  2. スタンドアロン機能を持つAddFunc()。ランタイムまで変数名(および変数の数)が不明であるため、実行できません。

  3. 変数が見つからない場合は、コールバックを追加するようにオブジェクトを変更します。私は実際にこれを行ったが、これを行うためにコールバックするためにソースのコピーを編集する必要があった。

  4. メソッドファンクションを使用できる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

答えて

5

はそれを考え出した...

TFloat64MethodFunc =機能:オブジェクトのTFLOAT。

0

昔(2004年)、私はこの問題に直面しました。私の解決策は、メソッドを受け入れるTurbo Power SysToolsエバリュエーターを使用することでした。

関連する問題