Autor Beitrag
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: So 02.03.03 18:25 
Hallo zusammen.

Ich möchte die parameterliste einer object-methode zur laufzeit auslesen! Dann könnte ich sie mit einem event-typ vergleichen und das event dynamisch zuweisen.

Hat das schonmal jemand von euch gemacht? Oder hat jemand eine idee wie,wo,ob diese informationen zur laufzeit verfügbar sind?

Es gibt, im zusammenhang mit RTTI, eine daten-structur, die TTypeData heisst, in der auch eine parameterlist auftaucht. Vielleicht hat sie was damit zu tun.

danke für ideen.
maximus.

Moderiert von user profile iconTino: "hallo hilfe" aus dem Titel entfernt.


Zuletzt bearbeitet von maximus am Mo 03.03.03 22:34, insgesamt 1-mal bearbeitet
maximus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Mo 03.03.03 12:29 
Kommt schon jungs :lol:

Das wär doch mal 'ne richtige herrausforderung für euch! Ich hab schon stundenlang experimentiert, ohne ergebnis. Vielleicht kennt ihr einen weg, an die DEFINITION-TABLE einer klasse anzukommen. Oder sonst irgendwas!? Alles was ich gefunden habe, bezieht sich immer auf datenbank-zeugs.

Ich weiss das ist ein harter brocken, aber hoffentlich nicht unmöglich!? Oder sagt mir wenigstens ob das unmöglich ist.

grüsse maximus :roll:
maximus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Mo 03.03.03 22:36 
Ihr haltet mich wohl für verrückt?

Vielleicht gibt es ne directive, mit der man diese infos 'mappen' kann?
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Mo 03.03.03 23:09 
Zitat:
Ich möchte die parameterliste einer object-methode zur laufzeit auslesen! Dann könnte ich sie mit einem event-typ vergleichen und das event dynamisch zuweisen.

Klingt irgenwie nach einem Interpeter?

_________________
Ist Zeit wirklich Geld?
maximus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Di 04.03.03 01:05 
Was ist ein 'Inter-peter'? *rofl*

Nein...im ernst: Es handelt sich nicht um ein interpreter, sondern um ein runtime-object-inspector! Dort kann ich den path (zB. 'scene.control.mouseEvent') zur methode, die aufgerufen werden soll, reinschreiben. Funktioniert auch wunderbar, wenn ich drauf achte, dass event-typ und methoden deklaration identisch sind.

Nun will ich dynamisch abgleichen, damit ich, wie bei delphi, melden kann, dass die parameter abweichen. Die parameterliste des events kann ich via RTTI auslesen. Die methoden-parameter bleiben aber im dunkeln...aber den methoden-namen kann ich auflösen

-> obj.MethodAddress().

Wenn er schon den namen speichert, wo sind dann die parameter? :roll:

Ich will keine fertigen lösungen, ich brauche IDEEN.

°maximus°
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Di 04.03.03 01:21 
Mit der RTTI bekommst du diese Information nicht, denn diese stehen nur in den .dcu Dateien und werden nicht mit in die .exe Datei eingebunden.


Zu den Ideen:
Da fallen mit so einige ein, wie man das Problem lösen kann, nur sind diese nur mit sehr viel Programmieraufwand lösbar.

So könntest du eine Liste mit den notwendigen Parametern als String anlegen. Z.B: pro Klasse eine TStringList mit "Methodenname=Sender: TObject ..."

Eine Andere Möglichkeit wäre, anstatt einer Methode einen Methodenzeiger zu verwenden:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
private
  FMedhode: TNotifyEvent;
  procedure _Methode(Sender: TObject);
published
  property Methode: TNotifyEvent read FMethode;
end;

constructor TObj.Create;
begin
  inherited Create;
  FMethode := _Methode;
end;

procedure TObj._Methode(Sender: TObject);
begin
  ...
end;
Hierbei kannst du per RTTI auf die Parameterliste der Eigenschaft Methode zugreifen.

_________________
Ist Zeit wirklich Geld?
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Di 04.03.03 01:26 
Bei letzterem kannst du mit
ausblenden Quelltext
1:
  ShowMessage(GetTypeData(GetPropInfo(Self, 'Method').PropType^).ParamList);					

Die Parameterliste auslesen.

_________________
Ist Zeit wirklich Geld?
maximus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Di 04.03.03 01:48 
:D Exakt beide ideen sind mir auch schon gekommen.

Das mit der string-tabelle macht keinen spass 8) weisst schon; alles doppelt schreiben und updaten!

Das mit dem Event hab ich auch schon untersucht...ist auf jeden fall die bessere möglichkeit...wenn alle stricke reissen. Cool das du dir die mühe gemacht hast...das ist auf jeden fall schonmal ein anfang :wink:

Ich suche eine möglichkeit, die zu 100% elegant ist *sagte er und starb an perfektionismus*
Vielleicht kennt du dich, oder wer anderes, mit VMT-TABLES aus, da holt delphi den methoden-namen raus!
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Di 04.03.03 09:31 
Zitat:
VMT-TABLES aus, da holt delphi den methoden-namen raus!

Nein, denn in der steht lediglich die Adresse der Methode und keine Namen. Die stehen in der RTTI. Deren Adresse steht zwar in der VMT (das T steht bereits für Table) aber eben nur die Adresse.


An die Parameterliste kommst du nur mit Properties oder alles doppet haben.
In der OH steht:
Zitat:
RTTI allows an application to query the fields and properties of an object dynamically and to locate its methods

Da steht nur: um die Adresse zu ermitteln. Von Informationen über diese steht da nicht.

_________________
Ist Zeit wirklich Geld?
maximus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Di 04.03.03 19:49 
Hmm...könntest recht haben!

Wenn die namen in den RTTI tabellen stehen, vielleicht kann ich da noch mehr rausquetschen.

Ich ruf bei Borland an und verlange eine erweiterung der RTTI daten :lol:

:roll: Naja, schön das wir mal drüber gesprochen haben. Ich Glaub ich lass es dann ganz weg, dann muss man sich halt sicher sein, wenn man ein event zuweisst. Bzw...ICH HABS...

...heureka! Wenn ich die methoden schreibe, trage ich in eine stringList den methoden-namen und den pointer auf die TypInfo, des Prozeduralen equivalents, zur methode, ein! -> kein doppelt getippe kein garnichts :D

Juhuuu..werds mal testen

Bis denn.
maximus