AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

class function per Rtti aufrufen

Ein Thema von ConstantGardener · begonnen am 12. Feb 2016 · letzter Beitrag vom 14. Feb 2016
Antwort Antwort
ConstantGardener

Registriert seit: 24. Jan 2006
Ort: Halberstadt
375 Beiträge
 
Delphi 10.4 Sydney
 
#1

class function per Rtti aufrufen

  Alt 12. Feb 2016, 20:57
Delphi-Version: 5
Hallo zusammen,

ich versuche gerade per Rtti eine class function aufzurufen. Das scheitert aber leider an der fehlenden Instanz bzw. an einer verbotenen Konvertierung zur Laufzeit.

Ich verwende im Moment diese Funktion von PRUZ aber das läuft so leider nicht. Ich will eigentlich nur eine Function mit einem String als Result aufrufen und dann ein class field setzen.

Delphi-Quellcode:
function RttiMethodInvokeEx(const MethodName:string; RttiType : TRttiType; Instance: TValue; const Args: array of TValue): TValue;
var
 Found : Boolean;
 LMethod : TRttiMethod;
 LIndex : Integer;
 LParams : TArray<TRttiParameter>;
begin
  Result:=nil;
  LMethod:=nil;
  Found:=False;
  for LMethod in RttiType.GetMethods do
   if SameText(LMethod.Name, MethodName) then
   begin
     LParams:=LMethod.GetParameters;
     if Length(Args)=Length(LParams) then
     begin
       Found:=True;
       for LIndex:=0 to Length(LParams)-1 do
       if LParams[LIndex].ParamType.Handle<>Args[LIndex].TypeInfo then
       begin
         Found:=False;
         Break;
       end;
     end;

     if Found then Break;
   end;

   if (LMethod<>nil) and Found then
     Result:=LMethod.Invoke(Instance, Args)
   else
     raise Exception.CreateFmt('method %s not found',[MethodName]);
end;
Hat da wer eine Idee?
Andreas Schachtner

Geändert von ConstantGardener (12. Feb 2016 um 21:03 Uhr) Grund: ...unter XE7
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.137 Beiträge
 
Delphi 12 Athens
 
#2

AW: class function per Rtti aufrufen

  Alt 13. Feb 2016, 19:15
Als "Instance" müsste keine Objekt-Instanz (TObject), sondern ein Klassen-Zeiger (TClass) reingegeben werden, denk ich mal.

Schade, daß Emba so blöd/nett war und das "dynamische" generieren von Funktionsdefionitionen etwas erschwert haben, sonst hätte man auch einfach das ganze als "billige" Prozedur, mit einem zusätzlichen Self-Parameter ansprechen können.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
ConstantGardener

Registriert seit: 24. Jan 2006
Ort: Halberstadt
375 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: class function per Rtti aufrufen

  Alt 14. Feb 2016, 19:59
Hallo Himitsu,

danke erstmal für den Hinweis. Ich hab das zwischenzeitlich anders umgesetzt (mit einem Dictionary<TClassName,TSQLRecordInfo>, ich suche mir per RTTI alle PoDo's im Programm raus, lese bestimmte Attribute zur Datentabelle (Name, ID, MasterID) aus und checke dann das Datenformat/Fieldliste, setze Insert und Update-Statements zusammen usw. also ein ORM für Arme).

Das Problem ist mit dem Aufruf der Funktion nicht zu Ende. Das setzen einer Class Var ist auch ein Problem da man die Class Var per RTTI nicht findet.
Andreas Schachtner
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz