2010-12-20 16 views
5

Zastanawiam się, czy to jest możliwe, czy nie, jeśli tak, to w jaki sposób? Proszę podać przykład kodu.Konwersja wskaźnika metody na liczbę całkowitą, a następnie wywołanie go

  • Jak przechowywać wskaźnik do metody obiektu jako wartość całkowitej?
  • Jak przekonwertować tę liczbę całkowitą z powrotem na "wskaźnik metody" i nazwać to?

Co chcę zrobić, to zapisać "wskaźnik metody" w całkowitej wartości znacznika obiektu pochodnego TComponent, a czasem później wywołać metodę zapisaną. Możesz założyć, że wszystkie spełnione metody mają tę samą definicję.

Dzięki!

+3

metoda wskaźnik przyzwyczajenie pasuje do 32bit Tag –

Odpowiedz

5

Można zrobić obejście, ale nie Si ładny design ...

var 
    Method: ^TNotifyEvent; 
begin 
//Create New method 
    GetMem(Method, SizeOf(TNotifyEvent)); 
//Init target Tag 
    Tag := Integer(Method); 

//Store some method 
    Method^ := Button1Click; 

//call stored method 
    Method := (Pointer(Tag)); 
    Method^(self); 

//And don't forget to call in to object destructor... 
    if Tag <> 0 then 
    FreeMem(pointer(Tag)); 
+0

dzięki. Wygląda na to, że twój kod jest przykładem opisu Craiga Petersona? –

+0

@Edwin, tak, to właśnie bym opublikował, gdybym miał więcej czasu. –

+0

Tak, pomysł jest taki sam. Używam go w jednym z moich programów ... –

9

Nie, to niemożliwe. Metoda obiektu jest równoważne TMethod:

TMethod = record 
    Code, Data: Pointer; 
end; 

Pole Code jest adres metody, a pole Data jest ukryty Self parametr, który jest przekazywana do każdej metody obiektu. Rekord ma ten sam rozmiar co Int 64, więc jeśli rzucisz go jako zwykłą liczbę całkowitą, stracisz połowę.

Możesz przydzielić rekord TMethod na stercie za pomocą GetMem, a następnie zapisać jego adres w właściwości Tag, o ile pamiętasz, aby zwolnić go po zakończeniu pracy.

+0

Dzięki za wyjaśnienie. Nie rozumiem, dlaczego kod Darian Miller zadziałał ... –

+0

Nie udało się. Prosta sprawa nie dotarła do niego, ale pojawiły się fatalne wady, które spowodowałyby awarię prawdziwego programu. –

Powiązane problemy