Frage

Ich schreibe eine Kontrolle in der Lage sein sollte, jede Liste von Daten anzuzeigen. Was ich tun wollte, war zu imitieren die for-in-Konstrukt, dass ich für eine öffentliche GetEnumerator Funktion überprüfen, die eine Current-Eigenschaft und eine Methode Movenext enthalten.

Ich habe folgendes bestimmt:

  1. kann ich die Existenz einer Methode überprüfen, indem Sie einfach auf Method mein Objekt aufrufen. Wenn ich die Adresse erhalten, besteht das Verfahren.
  2. Ich kann RTTI verwenden, um den Rückgabetyp der Methode zu überprüfen.
  3. Ich kann RTTI verwenden für die Eigenschaft zu überprüfen und zu lesen.

In-zwischen obwohl ich kleine Stücke von Informationen bin fehlt:

  1. Wie rufe ich die Methode, da seine Adresse? Ich schreibe ich nur eine Definition (wie ich würde für die Einfuhr), die Adresse werfen und rufen Sie das?
  2. Überprüfen der Rückgabetyp der Methode erfordert GetTypeData mit seiner PTypeInfo aufrufen. Ich erhalte die PTypeInfo von Typeinfo auf eine Art Aufruf. Also wie bekomme ich eine PTypeInfo für ein bestimmtes Verfahren, da nur seine Adresse?
War es hilfreich?

Lösung

  1. die Methode aufzurufen, nehmen Sie die zurückgegebene Adresse und legen Sie sie in den Code-Zeiger eines TMethod. Setzen Sie das Objekt in den Datenzeiger, und dann werfen sie ein Verfahren Zeiger mit der rechten Unterschrift.
  2. Um die Signatur einer Funktion zu analysieren, müssen Sie einige ziemlich kompliziert RTTI. Siehe http://hallvards.blogspot.com/2006 /05/hack-10-getting-parameters-of.html für die Details. Aber beachten Sie die Einschränkung nach unten hin:
  

Beachten Sie, dass dies nur funktioniert, wenn die   Instanz (oder eine seiner Komponenten)   auch hat eine veröffentlichte Eigenschaft, dass   verweist auf die veröffentlichten Methode. Das   gute Nachricht ist, dass dies der Fall ist für   die meisten bestehenden veröffentlichten Methoden - wie zum   wie die Event-Handler auf einem TForm   Beispiel. Die schlechte Nachricht ist, dass diese   wäre nicht der Fall für alle sein   veröffentlichten Methoden möchten wir   Aufruf dynamisch zur Laufzeit (und damit   wäre nicht zu irgendwelchen Ereignissen zugeordnet werden).

Also, was Sie versuchen unter Umständen nicht möglich unter dem aktuellen RTTI-Modell zu tun. Aber Delphi 2010 soll eine erweiterte RTTI-System haben, die es Ihnen ermöglichen, Dinge zu tun wie das viel leichter, und durch aus RSN ist es. (Früher gibt es einen Release-Countdown auf Embarcadero Website sein, die heute Abend gegen Mitternacht wurde heruntergezählt. Sie haben es heruntergenommen, obwohl, so dass ich nicht sicher bin, ob das ist immer noch das offizielle Release-Datum oder nicht.)

Andere Tipps

Zuerst beachten Sie, dass RTTI ist für veröffentlichten Eigenschaften und Methoden zur Verfügung.

das Verfahren durch MethodAdress abgerufen aufzurufen, einfach zu tun:

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

In Bezug auf Ihre zweite Frage, dies könnte helfen:

Link-

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top