2010-12-20 7 views
5

これは次のことが可能かどうか、もしそうなら、どうすればいいのでしょうか?コード例をお願いします。 整数値としてオブジェクト方法ポインタを格納する方法メソッドポインタを整数に変換してから呼び出す

  • その整数値を 'メソッドポインタ'に変換する方法とと呼びますか?

私がしたいのは、TComponent派生オブジェクトの整数タグ値に「メソッドポインタ」を格納し、後でそのメソッドを呼び出します。すべてのmetメソッドが同じ定義を持つと仮定できます。

ありがとうございます!

+3

メソッドポインタは文句を言わない32ビットのタグへの説明のための –

答えて

5

あなたは回避策を行うことができますが、それは素敵なデザインをSIではない...

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

あなたのコードはCraig Petersonの説明の一例ですね? –

+0

@エドウィン、そうですね、もっと時間があれば投稿したでしょう。 –

+0

はい、そのアイデアは同じです。私は私のプログラムの1つでそれを使用しています... –

9

いいえ、不可能です。オブジェクトのメソッドがTMethodと同等です:

TMethod = record 
    Code, Data: Pointer; 
end; 

Codeフィールドは、メソッドのアドレスであり、そしてDataフィールドは、すべてのオブジェクトのメソッドに渡された隠しSelfパラメータです。レコードはInt64と同じサイズなので、整数型としてキャストすると、その半分が失われます。

GetMemを使用してヒープにTMethodレコードを割り当ててから、そのタグのアドレスをTagプロパティに格納することができます。

+0

感謝し合います。私はDarian Millerのコードがなぜ働いたのか分かりません... –

+0

それはしませんでした。投稿されたシンプルなケースは、その中に入り込まなかったが、実際のプログラムをクラッシュさせた致命的な欠陥があった。ありがとう、 –

関連する問題