Я использую оценщик выражений JCL TEvaluator (изумительное создание, подаренное Барри Келли). (СПАСИБО, Барри!)
фон
Я использовал метод 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 Нет перегруженной версии 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;
спасибо за помощь!
тр