2016-07-21 28 views
2

Gibt es eine Möglichkeit, die Namen der Parameter einer bestimmten Methode einer Klasse/eines Objekts in einem Array/Trennzeichen in Delphi 7 zu erhalten? Irgendwie so:Wie bekomme ich eine Methode param Name Array/Liste in Delphi?

var 
    s : string; 
    aSL : TStringList; 
begin 
    ... 
    // using rtti calls in TMethodUtility.collectParamNames 
    s := TMethodUtility.collectParamNames(TStringList.addObject); 
    // or 
    TMethodUtility.collectParamNames(TStringList.addObject, aSL); 
    ... 
end; 

Vielen Dank im Voraus!

+0

Es gibt keine 'AddItem()' Methode in 'TString/List'. Es gibt 'Add()' und 'AddObject()' stattdessen. –

+0

OK. Ich habe es korrigiert. –

Antwort

4

Es ist technisch möglich (andernfalls könnte der Formular-Designer der IDE keinen Code für Komponentenereignishandler zur Entwurfszeit erzeugen), jedoch gibt es wichtige Vorbehalte, die Ihr Ziel behindern (und das bestimmte Beispiel in Ihrer Frage unmöglich machen) resolve):

  • die notwendige RTTI ist nur für Eigenschaften erzeugt, die als published (wie Komponente Ereignisse erklärt werden). RTTI wird nicht für Methoden selbst generiert (selbst published Einsen), oder für Eigenschaften, die nicht published sind.

  • TObject hat eine öffentliche MethodAddress() Methode für das Erhalten der Speicheradresse einer published Methode (das DFM-Streaming-System diese verwendet, wenn Event-Handler Einhaken) Sie können jedoch nicht die erforderliche RTTI aus einem Methodenzeiger allein zu bekommen.

IF Sie können eines published Ereignis an den Wert einen bestimmten Methodenzeiger übereinstimmen, dann können Sie die Parameternamen aus der Veranstaltung RTTI extrahieren. Besorgen Sie sich einen TypInfo.PPropInfo Zeiger für das Ereignis mit der TypInfo.GetPropInfo() Funktion, dann passieren seine PropType Feldwert an der TypInfo.GetTypeData() Funktion einen TypInfo.PTypeData Zeiger zu bekommen, und dann können Sie durchlaufen seine ParamList Feld (das ein Array von Datensätzen enthalten ParamName und TypeName Felder) .

Sehen Sie im folgenden Blog-Artikel zu diesem Thema, um weitere Informationen:

Getting the parameters of published methods.

Für das, was Sie versuchen, eine Universallösung würde Extended RTTI erfordern, die in Delphi 2010 eingeführt wurde und ist somit nicht in Delphi 7. Erweiterte RTTI nicht auf published Elemente beschränkt ist, und ist viel detaillierter als was das alte RTTI bietet.