Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Objekte bestimmter Klassen dynamisch erzeugen und freigeben (https://www.delphipraxis.net/192692-objekte-bestimmter-klassen-dynamisch-erzeugen-und-freigeben.html)

Ruediger123 11. Mai 2017 08:34

Objekte bestimmter Klassen dynamisch erzeugen und freigeben
 
Hallo, ich habe in einer selbst erstellten Klasse einige Felder als Objekt einer bestimmten Klasse.
Wie kann ich diese im Constructor bzw. Destructor dynamisch über eine "RTTI-Schleife" über alle vorhandenen Felder erzeugen/freigeben.


Code:
var
  rttiContextFeld: TRttiContext;
  rttiTypeFeld: TRttiType;
  rttiField: TRttiField;
begin
  rttiContextFeld := TRttiContext.Create;
  try
    rttiTypeFeld := rttiContextFeld.GetType(self.ClassType);

    for rttiField in rttiTypeFeld.GetDeclaredFields do
    begin
      if (rttiField.FieldType.ToString = AnsiUpperCase('TMyClass') then
      begin
        // Hier soll das Object erzeugt/freigegeben werden
       
      end;
    end;
  finally
    rttiContextFeld.Free;
  end;
end;

haentschman 11. Mai 2017 08:47

AW: Objekte bestimmter Klassen dynamisch erzeugen und freigeben
 
Moin...:P
Warum über die RTTI? :gruebel:
...statt?
Delphi-Quellcode:
public
  Bla :string read GetBla write SetBla;
...
constructor TBlubb.Create;
  FMyClass := TMyClass.Create; // Das ganze Objekt... die speziellen Properties über Getter / Setter regeln.
...
function TBlubb.GetBla: string;
begin
  Result := FMyClass.Bla;
end;
Zitat:

dynamisch
Sorry... ich hatte das dynamisch überlesen.

Uwe Raabe 11. Mai 2017 09:15

AW: Objekte bestimmter Klassen dynamisch erzeugen und freigeben
 
Delphi-Quellcode:
  // erzeugen
  rttiField.SetValue(Self, TValue.From<TMyClass>(TMyClass.Create)); // oder wie auch immer TMyClass.Create aufgerufen werden soll

  // freigeben
  rttiField.GetValue(Self).AsObject.Free;

bernau 11. Mai 2017 09:25

AW: Objekte bestimmter Klassen dynamisch erzeugen und freigeben
 
Du kannst über GetClass die Klasse ermitteln und diese dann erzeugen.

Such mal in der Delphipraxis nach "getClass" dann bekommst du einige Beispiele.

Die Klassen müssen allerdings vorher registriert werden.

Zacherl 11. Mai 2017 14:59

AW: Objekte bestimmter Klassen dynamisch erzeugen und freigeben
 
Zitat:

Zitat von haentschman (Beitrag 1370981)
Warum über die RTTI? :gruebel:

Zitat:

Zitat von haentschman (Beitrag 1370981)
Sorry... ich hatte das dynamisch überlesen.

Ich fühle mit dir. Irgendwie erscheinen in letzter Zeit ziemlich oft Threads, zur Lösung von Problemen per RTTI, bei denen ich den starken Verdacht habe, dass sie auch auf "normale" Art und Weise umgesetzt werden könnten. Vielleicht bin ich da noch ein wenig in alten Denkstrukturen gefangen, aber früher hieß es mal, dass übermäßige Verwendung der RTTI fast immer auf ein schwerwiegendes (Klassen-)Designproblem hindeutet (nicht speziell auf diesen Thread bezogen; für manche Sachen ist RTTI ja auch sinnvoll).

mjustin 11. Mai 2017 15:01

AW: Objekte bestimmter Klassen dynamisch erzeugen und freigeben
 
Zitat:

Zitat von bernau (Beitrag 1370985)
Die Klassen müssen allerdings vorher registriert werden.

Und sie müssen von TPersistent abgeleitet sein.

Ruediger123 11. Mai 2017 15:11

AW: Objekte bestimmter Klassen dynamisch erzeugen und freigeben
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1370983)
Delphi-Quellcode:
  // erzeugen
  rttiField.SetValue(Self, TValue.From<TMyClass>(TMyClass.Create)); // oder wie auch immer TMyClass.Create aufgerufen werden soll

  // freigeben
  rttiField.GetValue(Self).AsObject.Free;

Volltreffer! Vielen Dank! Ich habe ein Mapping auf Tabellen auf der Datenbank erstellt und da ist RTTI eine große Erleichterung.

Uwe Raabe 11. Mai 2017 15:52

AW: Objekte bestimmter Klassen dynamisch erzeugen und freigeben
 
Zitat:

Zitat von Zacherl (Beitrag 1371020)
Irgendwie erscheinen in letzter Zeit ziemlich oft Threads, zur Lösung von Problemen per RTTI, bei denen ich den starken Verdacht habe, dass sie auch auf "normale" Art und Weise umgesetzt werden könnten. Vielleicht bin ich da noch ein wenig in alten Denkstrukturen gefangen, aber früher hieß es mal, dass übermäßige Verwendung der RTTI fast immer auf ein schwerwiegendes (Klassen-)Designproblem hindeutet (nicht speziell auf diesen Thread bezogen; für manche Sachen ist RTTI ja auch sinnvoll).

Ich will gar nicht abstreiten, daß die neuen RTTI-Möglichkeiten auch inadäquat eingesetzt werden - allerdings nicht so oft, wie man das aus deinem Kommentar herauslesen kann. Viele Dinge lassen sich nur mit extensiver Kopplung ohne RTTI einsetzen, was vom Design her eher schädlich ist. Ein System zur JSON-Serialisierung zum Beispiel, muss entweder die zu serialisierenden Klassen kennen oder über virtuelle Methoden oder Interfaces die eigentliche Serialisierung in die Klasse selbst oder weitere Hilfsklassen auslagern. Und wenn jetzt einer sagt, dann nimm doch die published Properties - das ist auch RTTI (nur hard-coded und unflexibel) und die benutzen wir wohl alle hier in schöner Regelmäßigkeit schon seit Delphi 1.

Zacherl 11. Mai 2017 16:40

AW: Objekte bestimmter Klassen dynamisch erzeugen und freigeben
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1371029)
Zitat:

Zitat von Zacherl (Beitrag 1371020)
Irgendwie erscheinen in letzter Zeit ziemlich oft Threads, zur Lösung von Problemen per RTTI, bei denen ich den starken Verdacht habe, dass sie auch auf "normale" Art und Weise umgesetzt werden könnten. Vielleicht bin ich da noch ein wenig in alten Denkstrukturen gefangen, aber früher hieß es mal, dass übermäßige Verwendung der RTTI fast immer auf ein schwerwiegendes (Klassen-)Designproblem hindeutet (nicht speziell auf diesen Thread bezogen; für manche Sachen ist RTTI ja auch sinnvoll).

Ich will gar nicht abstreiten, daß die neuen RTTI-Möglichkeiten auch inadäquat eingesetzt werden - allerdings nicht so oft, wie man das aus deinem Kommentar herauslesen kann. Viele Dinge lassen sich nur mit extensiver Kopplung ohne RTTI einsetzen, was vom Design her eher schädlich ist.

Ich will die RTTI auch auf gar keinen Fall schlechtreden. Zur Serialisierung benutze ich sie selbst sehr gerne bzw. für eine automatische
Delphi-Quellcode:
AssignTo
oder
Delphi-Quellcode:
Equals
Funktion, kann sie auch sehr nützlich sein. Wenn es jetzt aber (wie hier im Beitrag) darum geht ein paar Felder einer sogar bekannten Klasse zu initialisieren, dann .. naja .. das kann man meiner Meinung nach auch manuell machen bzw. bei sehr vielen Feldern ein Array verwenden und die Properties/Setter/Getter über das
Delphi-Quellcode:
index
Keyword umsetzen.

mjustin 11. Mai 2017 16:51

AW: Objekte bestimmter Klassen dynamisch erzeugen und freigeben
 
Zitat:

Zitat von Ruediger123 (Beitrag 1370978)
Hallo, ich habe in einer selbst erstellten Klasse einige Felder als Objekt einer bestimmten Klasse.
Wie kann ich diese im Constructor bzw. Destructor dynamisch über eine "RTTI-Schleife" über alle vorhandenen Felder erzeugen/freigeben.

Für die automatische Freigabe der Felder im Destruktor bietet sich in Delphi auch der Einsatz von Interfaces an.
Dadurch entfällt der eigene Cleanup-Code zu 100%.


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:26 Uhr.

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