我正在使用 JCL 的表达式评估器 TEvaluator(由 barry kelly 捐赠的奇妙创作)。(谢谢你巴里!)
背景
我使用了 AddFunc 方法。
function MyFunc:double;
begin
// calculations here
Result:=1;
end;
您可以使用 AddFunc 方法使函数可用:
AddFunc('MyFunc', MyFunc);
这就是问题...
我需要在一个对象上调用一个方法,而不是一个独立的例程。
原因是我有一个提供值的对象列表。
假设我们有一个车辆对象列表。每个对象都有一个权重函数。我希望能够在公式中使用每个对象的重量。
一个愚蠢的例子,但很容易解释:
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 会是这样,但我的知识在这里太有限了......这是我不成功的尝试,但我仍然在 eval.AddFunc 处得到“E2250 没有可以用这些参数调用的 '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