Delphi - Name der Setter-Methode einer Eigenschaft extrahieren

8

In der folgenden Art:

%Vor%

Ich möchte den Namen der Setter-Methode der "MyProperty" -Eigenschaft über RTTI wissen. Ich habe Folgendes versucht:

%Vor%

Obwohl der Zeiger nicht Null ist, habe ich nur eine leere Nachricht. Hat jemand einen Tipp für mich?

P.S .: Ich benutze Delphi XE4, und ich weiß, dass ich Extended RTTI anstelle von Classic verwenden sollte, aber trotzdem kann ich in beiden Funktionen nicht machen, was ich will ... Also, jede Hilfe wird geschätzt. Danke für die Antworten.

Endgültige Ausgabe, Problem gelöst:

Hier ist der Code, der in der (Hilfe meiner Freunde und ...) RTTI-Einheit (DoSetValue-Methode der TRTTIInstanceProperty-Klasse) basiert:

%Vor%

NUR FÜR VIRTUELLE EINSTELLUNGEN, für die Statik ist die Nachricht leer. Danke an alle!

    
Daniel Chaves 17.07.2013, 02:45
quelle

2 Antworten

0

Lesen Sie c:\rad studio.0\source\rtl\common\System.Rtti.pas

%Vor%

Der Setter der Eigenschaft kann

sein
  • ein Feld (Variable)
  • eine statische Prozedur
  • eine virtuelle Prozedur (Ihr Fall)

Und diese Fälle machen PropInfo^.SetProc unterschiedliche Semantiken seines Wertes. Die direkte Adresse gilt nur für statische Prozeduren. Für virtuelle Methoden fügst du einen VMT-Offset hinzu und nimmst die Code-Adresse aus dieser Speicherzelle, wie in dem erwähnten Code angegeben (würde aber aus Copyright-Gründen nicht angeben).

Oder du könntest einfach TRttiProperty.SetValue benutzen und Delphi all die kleinen Details unter der Motorhaube machen lassen. Siehe Ссылка

BEARBEITEN:

  1. der Code entfernt - es hat nicht wörtlich funktioniert und das Thema Starter zur Verfügung gestellt Arbeitsversion.
  2. Was betrifft und ich weiß, dass ich Extended RTTI anstelle von classic one verwenden sollte - das ist fraglicher Anspruch. Extended RTTI arbeitet bekanntermaßen merklich langsamer als der klassische. Weiß nicht, ob jemand es profiliert hat, aber ich vermute, dass dies hauptsächlich auf den langsamen Code von TValue zurückzuführen ist. Sie können googeln und finden, dass viele Leute sich über die langsame Implementierung von TValue beschwert haben und alternative mit fester Effizienz bereitgestellt haben. Da Extended RTTI jedoch nur den Vorrat TValue verwendet, kann er nicht von diesen Implementierungen profitieren und bleibt langsamer als der klassische.
Arioch 'The 17.07.2013, 06:26
quelle
2

Sie können diesen Methodennamen abrufen, wenn

a) Verschieben Sie die Methode in den veröffentlichten Abschnitt (klassische RTTI funktioniert nur mit diesem Abschnitt (genauer gesagt - kompiliert mit {$ M +} Anweisung))

b) Verwenden Sie den richtigen Klassenspezifizierer - MyClass.MethodName , da MethodName die Klassenfunktion

ist

Dieser Code funktioniert auf D7 und XE3:

%Vor%

P.S. Welche Delphi-Version verwenden Sie? Was ist mit Extended RTTI (seit D2010)?

    
MBo 17.07.2013 06:20
quelle

Tags und Links