2009-03-27 2 views
3

저는 JCL의 표현 평가자 TEvaluator (barry kelly가 기증 한 멋진 생성물)를 사용하고 있습니다. (당신에게 베리 감사!) 내가 AddFunc 방법을 사용했습니다은 JCL의 TEvaluator에 대한 흥미로운 호출에 도움이 필요합니다.

배경. 내가 대신 객체의 메소드를 호출 할 필요가 ... 여기

AddFunc('MyFunc', MyFunc); 

문제의

을 :

function MyFunc:double; 
begin 
    // calculations here 
    Result:=1; 
end; 

사용 가능한 기능을 확인하기 위해 AddFunc 방법을 사용할 수 있습니다 독립 실행 형 루틴.

이유는 값을 제공하는 개체 목록이 있기 때문입니다.

우리는 차량 객체 목록을 가지고 있다고 말합니다. 각 오브젝트에는 가중치 함수가 있습니다. 수식에 사용할 수있는 각 객체의 가중치를 사용할 수있게 만들고 싶습니다.

바보 같은 예를하지만 설명하기 쉽습니다 :

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 평가기를 사용하여 메소드를 수용했습니다.