- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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 会更好。问题是我不知道要提供什么方法原型(prototype)。我认为 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
最佳答案
明白了...
TFloat64MethodFunc = 函数:对象的 TFloat;
关于delphi - 需要有关 JCL TEvaluator 有趣调用的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/691553/
有谁知道 Delphi 7 的 TEvaluator JCL 类中包含哪些预定义函数(例如 ABS 函数)? 最佳答案 Math.pas 中没有任何标准函数包括。默认评估解析器中实现的所有内容都是运算
我正在使用 JCL 的表达式评估器 TEvaluator(由 barry kelly 捐赠的奇妙作品)。 (谢谢巴里!) 背景 我使用了 AddFunc 方法。 function MyFunc:dou
我是一名优秀的程序员,十分优秀!