저는 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;
내 옵션 :
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