2009-03-27 3 views
3

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:

  1. 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.

  2. AddFunc() avec fonctions autonomes. ne peut pas faire cela parce que les noms de (et nombre de) variables est inconnu jusqu'à l'exécution.

  3. 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.

  4. 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

Répondre

5

pensé à elle ...

TFloat64MethodFunc = function: TFloat d'objet;

0

Il y a longtemps (2004), j'ai fait face à ce problème. Ma solution consistait alors à utiliser l'évaluateur Turbo Power SysTools, qui accepte les méthodes.