17

これはおそらく少しダミーの質問だと思いますが、かなり困惑しています。

プロシージャがオブジェクトのメソッドを呼び出すことができるように、オブジェクトのメソッドをプロシージャに渡す最も簡単な方法を探しています (たとえば、タイムアウト後、または別のスレッドで)。だから基本的に私はしたい:

  • オブジェクトのメソッドへの参照をキャプチャします。
  • その参照をプロシージャに渡します。
  • その参照を使用して、プロシージャからオブジェクトのメソッドを呼び出します。

インターフェイスを使っても同じ効果が得られると思いますが、この「オブジェクトの手続き」型宣言が存在するので、別の方法があると思いました。

以下は機能しませんが、私が混乱している場所を説明するのに役立つでしょうか...?

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;

(質問に答えたら、何らかの形で説明に役立つ場合を除き、上記のコードを削除します。)

4

2 に答える 2

19

Pointer のものを削除するだけです。Delphi がそれを行います。

procedure TCallbackObject.SetupCallback;
begin
  CallbackTheCallback(CallbackMethodImpl);
end;
于 2008-10-07T12:15:50.807 に答える
2

ポインター構文が必要ない理由は、メソッドの型をオブジェクトの手続きとして宣言したからです。コンパイラは、"of object" ステートメントから、コールバック プロシージャからメソッドを渡す処理方法を判断します。

于 2008-10-07T18:22:49.020 に答える