| Autor |
Beitrag |
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: 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 Tino: "hallo hilfe" aus dem Titel entfernt.
Zuletzt bearbeitet von maximus am Mo 03.03.03 22:34, insgesamt 1-mal bearbeitet
|
|
maximus 
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Mo 03.03.03 12:29
Kommt schon jungs
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 
|
|
maximus 
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: 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
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: 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 
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: 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?
Ich will keine fertigen lösungen, ich brauche IDEEN.
°maximus°
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: 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:
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
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Di 04.03.03 01:26
Bei letzterem kannst du mit
Quelltext 1:
| ShowMessage(GetTypeData(GetPropInfo(Self, 'Method').PropType^).ParamList); |
Die Parameterliste auslesen.
_________________ Ist Zeit wirklich Geld?
|
|
maximus 
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Di 04.03.03 01:48
 Exakt beide ideen sind mir auch schon gekommen.
Das mit der string-tabelle macht keinen spass  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
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
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: 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 
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: 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
 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
Juhuuu..werds mal testen
Bis denn.
maximus
|
|