J'utilise l'évaluateur d'expression de JCL TEvaluator (une création merveilleuse donnée par barry kelly). (MERCI barry!)besoin d'aide avec appel intéressant à TEvaluator JCL
fond
je l'ai utilisé la méthode addFunc.
function MyFunc:double;
begin
// calculations here
Result:=1;
end;
vous pouvez utiliser la méthode addFunc pour rendre la fonction disponible:
AddFunc('MyFunc', MyFunc);
est ici le problème ...
je dois appeler une méthode sur un objet au lieu d'un routine autonome.
la raison en est que j'ai une liste d'objets qui fournissent les valeurs. Disons que nous avons une liste d'objets de véhicules. chaque objet a une fonction de poids. Je veux être en mesure de rendre disponible le poids de chaque objet disponible pour une utilisation dans la formule.
un exemple idiot, mais il est facile à expliquer:
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;
mes options:
addVar() ou AddConst() - mais ce n'est pas si grand parce que je besoin d'être capable de déclencher une exception si la valeur n'est pas disponible.
AddFunc() avec fonctions autonomes. ne peut pas faire cela parce que les noms de (et nombre de) variables est inconnu jusqu'à l'exécution.
modifier l'objet pour ajouter un rappel si la variable est introuvable. J'ai réellement fait ceci mais ai dû éditer une copie de la source pour rappeler pour le faire faire ceci.
créer un AddFunc() capable d'utiliser les fonctions de la méthode.
L'option 3 est en fait construite, mais AddFunc supplémentaire serait plus agréable. le problème est que je ne sais pas quel prototype de méthode fournir. Je pensais que TMethod serait le chemin mais ma connaissance est trop limitée ici ... voici ma tentative infructueuse mais je reçois toujours "E2250 Il n'y a pas de version surchargée de 'AddFunc' qui peut être appelée avec ces arguments" à l'eval.AddFunc() appel comme avant.
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;
Nous vous remercions de votre aide!
mp