Methoden eines Objekts ermitteln

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2809
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Methoden eines Objekts ermitteln

Beitrag von m.fuchs »

Hallo,

ich tue mich gerade irgendwie schwer mit RTTI. Problem ist: ich möchte alle published Methoden eines Objekts auslesen und zwar mit den Infos Methodenname, Parameter und Rückgabewert (so es eine Funktion ist). Dazu dann noch ein Zeiger auf die Methode. Eigentlich dachte ich das wäre mit RTTI problemlos möglich, aber in den Beschreibungen und dem Quellcode sehe ich nur Möglichkeiten um Properties zu ermitteln.

Hab ich irgendetwas übersehen oder ist das gar nicht möglich?


mfg
Michael
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Methoden eines Objekts ermitteln

Beitrag von theo »

Ist mir nicht bekannt, dass das geht (Was nicht heissen muss, dass es nicht irgendwie geht).
Methoden von normalen Klassen sind ja auch nicht published.
Was möchtest du denn damit erreichen?

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2809
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Methoden eines Objekts ermitteln

Beitrag von m.fuchs »

theo hat geschrieben:Methoden von normalen Klassen sind ja auch nicht published.
Jo, aber man kann sie publishen. Das wird ja auch irgendeinen Sinn haben.
theo hat geschrieben:Was möchtest du denn damit erreichen?
Ich möchte eine Liste von Referenzen auf Methoden speichern. Dazu wird einer Prozedur namens RegisterBla ein Objekt übergeben. Die Prozedur ermittelt dann alle published Methoden und speichert die (also einen Zeiger darauf), die einem bestimmten Schema entsprechen in einer Liste. Das könnte ich durchaus auch anders Lösen, aber so fände ich es den elegantesten Weg.

mfg
Michael
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Methoden eines Objekts ermitteln

Beitrag von pluto »

Meines wissens wird in der Published Sektion nur Eigenschaften gespeichert die auch im OI angezeigt werden. schau mal in die unit: Types(meine ich war das). Da findest du einige Procedure / Funktionen.
Ich meine, dass geht nur mit Eigenschaften(Property), meinst du vielleicht das ? Methoden würden auch gehen, wenn sie als glaube ich Methoden-Zeiger genutzt werden.
MFG
Michael Springwald

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Methoden eines Objekts ermitteln

Beitrag von Socke »

Ohne mich damit auszukennen, denke ich mal mit:
  • Im OI werden published Eigenschaften angezeigt.
  • Auch Events sind Eigenschaften
  • Lazarus kann automatisch zu einem Event einen Methodenrumpf erzeugen
  • Man kann selbst geschriebene Methoden als Eventhandler aufrufen; diese müssen aber als published deklariert sein
  • => Frage: Wie wird beim Streaming ein Eventhandler nur vom Namen her zugewiesen (siehe .lfm-Datei), wenn dieser nicht bekannt ist?
  • => Lazarus muss die formale Parameterliste und den Rückgabetyp kennen
  • => Funktionstypen sind per RTTI erreichbar (sowohl deklarierte Methoden als auch reine Typen als Eigenschaften-Typ)
Wie man daran kommt, kann ich euch nicht sagen; evtl. hilft der Lazarus-Quelltext
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Methoden eines Objekts ermitteln

Beitrag von pluto »

=> Frage: Wie wird beim Streaming ein Eventhandler nur vom Namen her zugewiesen (siehe .lfm-Datei), wenn dieser nicht bekannt ist?
Es gibt da gewisse Möglichkeiten. Ich habe z.b. ein Weg gefunden um Klassen auf diese Art und weise zu erzeugen. Vielleicht klappt das auch bei Events. Mein Weg war folgender:
Jede Klasse wird einmal Installisiert. Wird eine Klasse gebraucht wird davon einfach eine Kopie erzeugt. Ich denke bei events könnte etwas ähnliches passieren. Schaut euch doch mal die Entsprechende Procedure an.
=> Lazarus muss die formale Parameterliste und den Rückgabetyp kennen
Ich denke, dass hat weniger mit Lazarus zu tun, als mit den Tollen Codetools. Diese kennen die Paramenterliste.
Kann aber auch sein, dass ich die RTTI noch nicht vollständig kenne bzw. das es gewisse Lücken gibt.
MFG
Michael Springwald

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Methoden eines Objekts ermitteln

Beitrag von mse »

Socke hat geschrieben: [*]=> Frage: Wie wird beim Streaming ein Eventhandler nur vom Namen her zugewiesen
In TObject:

Code: Alles auswählen

class function MethodAddress(const name : shortstring) : pointer;
Der Instanz-Pointer in TMethod muss zusätzlich gesetzt werden.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2809
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Methoden eines Objekts ermitteln

Beitrag von m.fuchs »

Ich sehe schon, ist alles nicht so einfach. Dann werde ich doch eher Properties abfragen die Methodenzeiger sind. Ist für die Entwickler ein bisschen umständlicher, aber muss halt so gehen.

Danke euch
Michael
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten