2010-05-07 28 views
3

我想要做的是将一个匿名方法作为函数结果分配给一个相同类型的变量。德尔福抱怨说不能做这个分配。很明显,我想为Delphi函数分配“GetListener”函数而不是该函数的结果。任何帮助都非常感谢。作为函数结果的匿名方法

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; 

回答

11

使用以下语法:

Listener:= MyClass.GetListener(); 

我写了下面的例子,使MyClass.GetListener()和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

谢谢Serg。正是这两个()我正在寻找。 Soemtimes事情是如此容易..如果你知道他们。 – iamjoosy 2010-05-07 13:21:24

+0

+1,但现在我的头痛.. – 2010-05-07 15:17:13

+1

这就是为什么我总是使用C的调用语法(aka()括号)来清楚它是什么时候的调用。 – alex 2010-05-07 16:32:23

0

我已经找到解决这个问题的唯一办法就是声明你GetListener这样的:

procedure GetListener(var a: TPropertyChangedListener); 

可能有一些语法强制编译器要考虑功能的结果,而不是功能本身,但我找不到任何。

+0

好,是的,我自己想过这个解决方案。缺点是,它使代码有点肮脏 - 尤其是因为在我的真实代码中,我想将GetListener结果添加到TList 中。在这种情况下,我需要声明一个额外的变量,按照您的建议获取监听器,并将该变量添加到列表中而不是MyList.Add(GetListener) – iamjoosy 2010-05-07 12:46:46