当前位置:  开发笔记 > 编程语言 > 正文

需要帮助对JCL的TEvaluator进行有趣的调用

如何解决《需要帮助对JCL的TEvaluator进行有趣的调用》经验,为你挑选了1个好方法。

我正在使用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会是方式,但我的知识在这里太有限了...这是我的尝试不成功但我仍然得到"E2250在eval.AddFunc中没有可以使用这些参数调用'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;

谢谢您的帮助!

熔点



1> X-Ray..:

弄清楚了...

TFloat64MethodFunc = function:对象的TFloat;

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有