2010-05-07 9 views
3

Ce que je veux faire est d'assigner une méthode anonyme que je reçois comme résultat d'une fonction à une variable du même type. Delphi se plaint de ne pas être capable de faire l'assignation. Evidemment choses Delphi je veux assigner la fonction "GetListener" au lieu du résultat de cette même fonction. Toute aide avec ceci est très appréciée.Méthode anonyme comme résultat de la fonction

type 
     TPropertyChangedListener = reference to procedure (Sender: TStimulus); 

     TMyClass = class 
     function GetListener:TPropertyChangedListener 
     end; 


    .... 

    var MyClass: TMyClass; 
     Listener: TPropertyChangedListener; 
    begin 
     MyClass:= TMyClass.create; 
     Listener:= MyClass.GetListener; // Delphi compile error: E2010 Incompatible types: TPropertyChangedListener' and 'Procedure of object' 

    end; 

Répondre

11

Utilisez la syntaxe suivante:

Listener:= MyClass.GetListener(); 

J'ai écrit l'exemple suivant pour préciser la différence entre les MyClass.GetListener() et les affectations de MyClass.GetListener:

type 
    TProcRef = reference to procedure(Sender: TObject); 
    TFunc = function: TProcRef of object; 

    TMyClass = class 
    function GetListener: TProcRef; 
    end; 

function TMyClass.GetListener: TProcRef; 
begin 
    Result:= procedure(Sender: TObject) 
    begin 
    Sender.Free; 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    MyClass: TMyClass; 
    ProcRef: TProcRef; 
    Func: TFunc; 

begin 
    MyClass:= TMyClass.Create; 
// standard syntax 
    ProcRef:= MyClass.GetListener(); 

// also possible syntax 
// Func:= MyClass.GetListener; 
// ProcRef:= Func(); 

    ProcRef(MyClass); 
end; 
+0

Merci Serg. C'était exactement ces deux() que je cherchais. Soemtimes les choses sont si faciles .. si vous les connaissez. – iamjoosy

+0

+1 mais maintenant j'ai mal à la tête .. –

+1

C'est pourquoi j'utilise toujours la syntaxe d'appel de C (aka() parenthèse) pour rendre clair quand il s'agit d'un appel. – alex

0

La seule façon que j'ai trouvé pour contourner c'est de déclarer votre GetListener comme ceci:

procedure GetListener(var a: TPropertyChangedListener); 

Il pourrait y avoir une syntaxe pour forcer le compilateur à considérer le résultat de la fonction au lieu de la fonctionner lui-même, mais je ne pouvais pas en trouver.

+0

bien Oui, j'ai pensé à cette solution moi-même. L'inconvénient est que cela rend le code un peu plus sale - d'autant plus que dans mon vrai code je veux ajouter le résultat GetListener dans un TList . Dans ce cas, je devrais déclarer une variable supplémentaire, obtenir le Listener comme vous l'avez suggéré, et ajouter la variable à la liste au lieu de MyList.Add (GetListener) – iamjoosy