これは次のことが可能かどうか、もしそうなら、どうすればいいのでしょうか?コード例をお願いします。 整数値としてオブジェクト方法ポインタを格納する方法メソッドポインタを整数に変換してから呼び出す
- ?
- その整数値を 'メソッドポインタ'に変換する方法とと呼びますか?
私がしたいのは、TComponent派生オブジェクトの整数タグ値に「メソッドポインタ」を格納し、後でそのメソッドを呼び出します。すべてのmetメソッドが同じ定義を持つと仮定できます。
ありがとうございます!
これは次のことが可能かどうか、もしそうなら、どうすればいいのでしょうか?コード例をお願いします。 整数値としてオブジェクト方法ポインタを格納する方法メソッドポインタを整数に変換してから呼び出す
私がしたいのは、TComponent派生オブジェクトの整数タグ値に「メソッドポインタ」を格納し、後でそのメソッドを呼び出します。すべてのmetメソッドが同じ定義を持つと仮定できます。
ありがとうございます!
あなたは回避策を行うことができますが、それは素敵なデザインを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));
あなたのコードはCraig Petersonの説明の一例ですね? –
@エドウィン、そうですね、もっと時間があれば投稿したでしょう。 –
はい、そのアイデアは同じです。私は私のプログラムの1つでそれを使用しています... –
いいえ、不可能です。オブジェクトのメソッドがTMethodと同等です:
TMethod = record
Code, Data: Pointer;
end;
Code
フィールドは、メソッドのアドレスであり、そしてData
フィールドは、すべてのオブジェクトのメソッドに渡された隠しSelf
パラメータです。レコードはInt64と同じサイズなので、整数型としてキャストすると、その半分が失われます。
GetMemを使用してヒープにTMethodレコードを割り当ててから、そのタグのアドレスをTagプロパティに格納することができます。
感謝し合います。私はDarian Millerのコードがなぜ働いたのか分かりません... –
それはしませんでした。投稿されたシンプルなケースは、その中に入り込まなかったが、実際のプログラムをクラッシュさせた致命的な欠陥があった。ありがとう、 –
メソッドポインタは文句を言わない32ビットのタグへの説明のための –