1

データのリストを表示できるはずのコントロールを書いています。私がやりたかったのは、CurrentプロパティとMoveNextメソッドを含むパブリックGetEnumerator関数をチェックするという点で、for-in構造を模倣することでした。

私は次のことを決定しました:

  1. オブジェクトでMethodAddressを呼び出すだけで、メソッドの存在を確認できます。アドレスを取得すると、メソッドが存在します。
  2. RTTIを使用して、メソッドの戻り型を確認できます。
  3. RTTIを使用して、プロパティを確認し、読み取ることができます。

しかし、その間に、私は少しの情報が欠けています:

  1. アドレスを指定してメソッドを呼び出すにはどうすればよいですか?(インポートの場合と同じように)定義を記述し、アドレスをキャストして呼び出すだけですか?
  2. メソッドの戻り型を確認するには、PTypeInfoを使用してGetTypeDataを呼び出す必要があります。タイプでTypeInfoを呼び出すことにより、PTypeInfoを取得します。では、アドレスのみを指定して、特定のメソッドのPTypeInfoを取得するにはどうすればよいですか?
4

2 に答える 2

2
  1. メソッドを呼び出すには、返されたアドレスを取得し、それを TMethod の Code ポインタに入れます。オブジェクトをデータ ポインターに配置し、正しいシグネチャを持つメソッド ポインターにキャストします。
  2. 関数のシグネチャを分析するには、かなり複雑な RTTI が必要です。詳細については、 http://hallvards.blogspot.com/2006/05/hack-10-getting-parameters-of.htmlを参照してください。ただし、下の方の警告に注意してください。

これは、インスタンス (またはそのコンポーネントの 1 つ) に公開されたメソッドを指す公開されたプロパティもある場合にのみ機能することに注意してください。幸いなことに、TForm インスタンスのイベント ハンドラなど、既存のほとんどの公開メソッドがこれに該当します。悪いニュースは、これは、実行時に動的に呼び出したい発行済みメソッドには当てはまらない (したがって、イベントに割り当てられない) ことです。

あなたがやろうとしていることは、現在の RTTI モデルでは不可能かもしれません。しかし、Delphi 2010 には拡張された RTTI システムが搭載されており、そのようなことをより簡単に実行できるようになる予定であり、RSN が予定されています。(Embarcadero のサイトには、今夜の真夜中に向かってカウントダウンしていたリリース カウントダウンがありました。しかし、彼らはそれを削除したので、それがまだ正式なリリース日であるかどうかはわかりません。)

于 2009-08-24T13:02:43.113 に答える
1

最初に、RTTI は公開されたプロパティとメソッドでのみ使用できることに注意してください。

MethodAdress によって取得されたメソッドを呼び出すには、次のようにします。

TMyMethod = procedure (Self : TObject; const Param : String);
...
var
  MyMethod : TMyMethod;
...
MyMethod := Obj.MethodAdress ('MethodName');
if Assigned (MyMethod) then
  MyMethod (Obj, 'Hallo');

2番目の質問に関して、これが役立つかもしれません:

リンク

于 2009-08-24T09:47:58.523 に答える