2012-05-05 16 views
3

Lazarus/delphiのメンバ関数のポインタを取得する方法はありますか?ラザロで
variable required


Error: Incompatible types: got "<procedure variable type of function(Byte):LongInt of object;StdCall>" expected "Pointer"メンバー関数delphiのポインタを取得


コード:

TClassA = class 
    public 
     function ImportantFunc(AParameter: byte): integer; stdcall; 
    end; 

    TClassB = class 
    public 
    ObjectA: TClassA; 
    ImportantPtr: pointer; 
    procedure WorkerFunc; 
    end; 

    function TClassA.ImportantFunc(AParameter: byte): integer; stdcall; 
    begin 
    // some important stuff 
    end; 

    procedure TClassB.WorkerFunc; 
    begin 
    ImportantPtr := @ObjectA.ImportantFunc; // <-- ERROR HERE 
    end; 
私は

エラーは、Delphiで です....コンパイルされません。このコードを持っています

ありがとう!

答えて

3

メンバ関数を単一のポインタで表すことはできません。インスタンス用とコード用の2つのポインタが必要です。しかし、それは実装の詳細です。

type 
    TImportantFunc = function(AParameter: byte): integer of object; stdcall; 

次に、このタイプの変数に「ImportantFunc」を割り当てることができます。

あなたはstdcallを使用しているので、私はこれをWindowsのコールバックとして使用しようとしていると思われます。これはメンバー関数にとって不可能です。グローバルスコープの関数、または静的関数が必要です。

+1

を使用するだけでスコープに関数名が必要な場合は?メソッドを 'class'メソッドとして定義し、' TMethod.Code'ポインタをコールバックとして渡すことができますか?か否か? – teran

+0

@David:そうです。私はコールバックとしてそれを使用したい。しかし、「TClassA」は実際にはTCollectionItem(!)なので、すべての項目には独自のWindowsコールバックが必要です:(したがって、グローバルスコープ内で定義することはできませんが、それは不可能であると信じることはできません。 – Peter

+0

@teranは、クラスメソッドではなく静的でなければならないでしょう –

2
type 
    TImportantFunc = function(AParameter: byte): integer of object;stdcall; 

    ImportantPtr: TImportantFunc; 

procedure TClassB.WorkerFunc; 
begin 
    ImportantPtr := ObjectA.ImportantFunc; // <-- OK HERE 
end; 
1

ObjectA.ImportantFuncメモリ位置ではないので、アドレスオペレータ@は、それに適用することができない - 従ってコンパイラエラー。これは2つのポインタ、@TClassA.ImportantFunc(メソッドコード)とObjectA(自己引数)です。あなたの質問に対する答えは、あなたが本当に必要とするもの、つまりコードポインタ、自己、どちらか、あるいはまったくなしに依存します。


あなたはそれができない理由クラスの静的メソッド

TClassA = class 
public 
class function ImportantFunc(Instance: TClassA; AParameter: byte): integer; 
                   stdcall; static; 
end; 
関連する問題