2010-05-07 4 views
3

내가 원하는 것은 익명 메서드를 함수 결과로 동일한 형식의 변수에 할당하는 것입니다. 델파이는 배정을 할 수 없다고 불평합니다. 분명히 그 같은 기능의 결과 대신 "GetListener"함수를 할당하려는 델파이 것들. 이것에 대한 도움은 매우 감사합니다. 의 대신익명 메서드를 함수 결과로 사용합니다.

procedure GetListener(var a: TPropertyChangedListener); 

함수의 결과를 고려하도록 컴파일러에 강제로 어떤 구문이있을 수 있습니다 :

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

다음 구문을 사용 : 음

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

Thanks Serg. 내가 찾던 바로이 두 가지()였습니다. 당신이 그들을 아는 한 일들은 너무 쉽습니다. – iamjoosy

+0

+1하지만 지금은 머리가 아프다. –

+1

그래서 나는 항상 C의 호출 문법 (aka() 괄호)를 사용하여 호출 할 때이를 명확하게한다. – alex

0

나는이 문제를 해결하기 위해 찾은 유일한 방법은 다음과 같이 당신의 GetListener를 선언하는 것입니다 기능 자체는 찾지 못했습니다.

+0

: 나는 분명히하여 MyClass.GetListener의 차이()와 MyClass.GetListener 할당을 만들기 위해 다음의 예를 작성했습니다

Listener:= MyClass.GetListener(); 

을 예, 저는 그 해결책에 대해 직접 생각했습니다. 단점은 코드가 좀 더 더럽다는 것입니다. 특히 실제 코드에서 GetListener 결과를 TList 에 추가하려고합니다. 이 경우 추가 변수를 선언하고 제안 된대로 Listener를 가져와 MyList.Add (GetListener) 대신 목록에 변수를 추가해야합니다. – iamjoosy