3

我正在使用 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;

我的选择:

  1. AddVar() 或 AddConst()——但这不是很好,因为如果值不可用,我需要能够引发异常。

  2. 带有独立函数的 AddFunc( )。不能这样做,因为变量的名称(和数量)在运行之前是未知的。

  3. 如果未找到变量,请修改对象以添加回调。我实际上已经这样做了,但需要编辑源的副本以回调以使其执行此操作。

  4. 制作一个能够使用方法函数的 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

4

2 回答 2

5

弄清楚了...

TFloat64MethodFunc = 函数:对象的 TFloat;

于 2009-03-27T22:00:16.567 回答
0

很久以前(2004 年),我遇到过这个问题。然后我的解决方案是使用 Turbo Power SysTools 评估器,它接受方法。

于 2011-03-10T16:46:24.800 回答