2010-05-07 76 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