2008-10-07 5 views
16

이 질문은 아마도 약간의 모호한 질문 일 수 있습니다.하지만 꽤 괴롭습니다.개체 메서드를 Delphi에서 매개 변수로 전달한 다음 호출하는 방법?

프로 시저가 개체의 메서드를 호출 할 수 있도록 (예 : 시간 초과 후 또는 다른 스레드에서) 개체 메서드를 프로 시저로 전달하는 가장 간단한 방법을 찾고 있습니다. 기본적으로 다음과 같이하고 싶습니다.

  • 개체 메서드에 대한 참조를 캡처합니다.
  • 해당 참조를 프로 시저에 전달하십시오.
  • 해당 참조를 사용하여 프로 시저에서 개체의 메서드를 호출하십시오.

저는 인터페이스를 사용하여 동일한 효과를 얻을 수 있다고 생각하지만,이 "객체 프로 시저"유형 선언이 있기 때문에 다른 방법이 있다고 생각했습니다.

다음 일이 아니지만 내가 혼란스러워하는 곳을 설명하는 데 도움이 될 수 있습니다 ...?

interface 
    TCallbackMethod = procedure of object; 

    TCallbackObject = class 
    procedure CallbackMethodImpl; 
    procedure SetupCallback; 
    end; 

implementation 

procedure CallbackTheCallback(const callbackMethod: TCallbackMethod); 
begin 
    callbackMethod(); 
end; 

procedure TCallbackObject.CallbackMethodImpl; 
begin 
    // Do whatever. 
end; 

procedure TCallbackObject.SetupCallback; 
begin 
    // following line doesn't compile - it fails with "E2036 Variable required" 
    CallbackTheCallback(@self.CallbackMethodImpl); 
end; 

+0

코드를 남겨주세요. –

+0

인상적 일부 사람들이 일을 더 힘들게하는 방법, 내가 여기서 일하는 스레드 호출 메서드를 분석하면이 접근법을 사용하여 호출을하면 훨씬 쉽게 될 것입니다. 질문에 대한 질문은 – kabstergo

답변

18

그냥 포인터 물건을 제거 (문제는 어떻게 든 설명을 보조하지 않는 한 나는 위의 코드를 제거 할 수 있습니다. 대답하면). 델파이는 당신을 위해 그것을 할 것입니다 : 당신이 포인터 구문을 필요가 없습니다

procedure TCallbackObject.SetupCallback; 
begin 
    CallbackTheCallback(CallbackMethodImpl); 
end; 
+0

인상적으로 간단하다, 고마워! –

2

이유는 당신이 객체의 절차와 방법의 유형을 선언 한 것입니다. 컴파일러는 "of of object"문에서 콜백 proc 메소드를 처리하는 방법을 알아낼 것입니다.

+0

제가보기에 - 감사합니다 :) –

관련 문제