2008-10-07 26 views
16

Korkarım ki bu biraz aptalca bir soru, ama beni çok şaşırttı.Delphi'de Nesne Yöntemi Parametre Olarak Nasıl Aktarılır?

Bir yöntemin bir yöntemini bir prosedüre iletmek için mümkün olan en basit yolu arıyorum, böylece prosedür nesnenin yöntemini (ör. Bir zaman aşımından sonra veya başka bir iş parçacığında) çağırabilir. Bu yüzden temel olarak şunları yapmak istiyorum:

  • Nesnenin yöntemine bir başvuru yakalayın.
  • Bir başvuruya bu referansı verin.
  • Bu referansı kullanarak, nesnenin yöntemini prosedürden çağırın.

Arabirimleri kullanarak aynı etkiyi gerçekleştirebileceğimi düşünüyorum, ancak başka bir yol olduğunu düşündüm, çünkü bu "nesne prosedürü" türü bildirimi var.

Aşağıdaki , çalışmaz, ancak kafamın karıştığını açıklamaya yardımcı olabilir ...?

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

Lütfen kodu bırakınız. –

+0

, bazı insanların işleri daha zor bir şekilde yaptıklarını, burada çalıştığım iş parçacığı yöntemini analiz ederek, bu yaklaşımı kullanarak çağrıları yapmaları çok daha kolay olurdu. soru için thx – kabstergo

cevap

18

Sadece Pointer şeyler kaldırmak (soru bir şekilde açıklama yardımcı sürece yukarıdaki kodu kaldırırız. Cevap sonra). Delphi sizin için yapacağım: Eğer işaretçi sözdizimi gerekmez

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

Etkileyici basit, teşekkürler! –

2

nedeni nesnenin bir prosedür olarak metod tipini deklare ettik olmasıdır. Derleyici, "nesne" deyiminden, geri çağırma proc'undan yöntemi geçirmenin nasıl işleneceğini anlayacaktır.

+0

Anladım - teşekkürler :) –

İlgili konular