Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Liste aller Methoden eines Objects zur Laufzeit erstellen (https://www.delphipraxis.net/114489-liste-aller-methoden-eines-objects-zur-laufzeit-erstellen.html)

Oracle 26. Mai 2008 12:25


Liste aller Methoden eines Objects zur Laufzeit erstellen
 
Ich möchte mir zur Laufzeit eine Liste aller Methoden eines Objekts erstellen und diese in einer Listbox anzeigen lassen.
Gibt es eine Möglichkeit, an diese Informationen zur Laufzeit heranzukommen? Mir würde es auch reichen, wenn ich nur alle public Methoden herausbekäme.

Vielen Dank euch schonmal im Vorraus :-D

sirius 26. Mai 2008 12:29

Re: Liste aller Methoden eines Objects zur Laufzeit erstelle
 
Wenn es dir ausreicht, alle published Methoden zu nehmen, dann ja.

shmia 26. Mai 2008 12:37

Re: Liste aller Methoden eines Objects zur Laufzeit erstelle
 
Du kommst per RTTI nur an die Published Methoden ran.
Genauer gesagt, bekommst du einen untypisierten Zeiger auf die Methode(n).
Delphi-Quellcode:
var method:TMethod;
  method := GetMethodProp(obj, name_der_methode);
  if Assigned(method.Code) then
     s := TObject(method.Data).ClassName+'.'+TObject(method.Data).MethodName(method.Code)
Wenn du die Signatur der Methode nicht kennst, kannst du sie nicht aufrufen.

Oracle 26. Mai 2008 12:53

Re: Liste aller Methoden eines Objects zur Laufzeit erstelle
 
was übergebe ich denn in der Zeile:

Delphi-Quellcode:
method := GetMethodProp(obj, name_der_methode);
in der Variable "name der Methode"?

sirius 26. Mai 2008 12:58

Re: Liste aller Methoden eines Objects zur Laufzeit erstelle
 
Weis nicht, ob es dafür bereits eine Funktion gibt.
Delphi-Quellcode:
procedure getMethodList(aClass:TClass; const List:TStrings);
Type PMethodEntry=^TMethodEntry;
     TMethodEntry=packed record
       size:Word;
       Adr:pointer;
       Name:Shortstring;
     end;
var mTable:ppointer;
    ClassName:String;
    MethodCount:PWord;
    MethodEntry:PMethodEntry;
    i:integer;
begin
  while aClass<>nil do
  begin
    mTable:=pointer(integer(aClass)+vmtMethodTable);
    if (mTable<>nil)and(mTable^<>nil) then
    begin
      MethodCount:=mTable^;
      MethodEntry:=pointer(integer(MethodCount)+2);
      ClassName:=aClass.ClassName;
      for i:=1 to MethodCount^ do
      begin
        List.add(aClass.ClassName+'.'+MethodEntry^.Name);
        MethodEntry:=pointer(integer(MethodEntry)+MethodEntry^.size);
      end;
    end;
    aClass:=aClass.ClassParent;
  end;
end;

Oracle 26. Mai 2008 15:40

Re: Liste aller Methoden eines Objects zur Laufzeit erstelle
 
super!! Danke Sirius deine Variante funktioniert auf Anhieb.
Nun noch eine Frage, bekommt man zusätzlich auch die Signatur heraus?

Hawkeye219 26. Mai 2008 16:27

Re: Liste aller Methoden eines Objects zur Laufzeit erstelle
 
Hi,

bei Hallvard Vassbotn findet man einen Blog-Eintrag zu Extended Class RTTI.

Gruß Hawkeye

sirius 26. Mai 2008 17:41

Re: Liste aller Methoden eines Objects zur Laufzeit erstelle
 
Mir war doch so, dass ich das schon mal geschrieben hatte.

Oracle 27. Mai 2008 10:28

Re: Liste aller Methoden eines Objects zur Laufzeit erstelle
 
Das war der entscheidene Tip. Jetzt läufts. Dankeschön :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz