AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Objekte bestimmter Klassen dynamisch erzeugen und freigeben

Objekte bestimmter Klassen dynamisch erzeugen und freigeben

Ein Thema von Ruediger123 · begonnen am 11. Mai 2017 · letzter Beitrag vom 11. Mai 2017
Antwort Antwort
Ruediger123

Registriert seit: 30. Aug 2011
16 Beiträge
 
#1

Objekte bestimmter Klassen dynamisch erzeugen und freigeben

  Alt 11. Mai 2017, 07:34
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;
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
4.536 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

AW: Objekte bestimmter Klassen dynamisch erzeugen und freigeben

  Alt 11. Mai 2017, 07:47
Moin...
Warum über die RTTI?
...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.

Geändert von haentschman (11. Mai 2017 um 07:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
7.892 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Objekte bestimmter Klassen dynamisch erzeugen und freigeben

  Alt 11. Mai 2017, 08:15
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.102 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Objekte bestimmter Klassen dynamisch erzeugen und freigeben

  Alt 11. Mai 2017, 08:25
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.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: Objekte bestimmter Klassen dynamisch erzeugen und freigeben

  Alt 11. Mai 2017, 13:59
Warum über die RTTI?
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).
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
2.766 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Objekte bestimmter Klassen dynamisch erzeugen und freigeben

  Alt 11. Mai 2017, 14:01
Die Klassen müssen allerdings vorher registriert werden.
Und sie müssen von TPersistent abgeleitet sein.
Michael Justin
  Mit Zitat antworten Zitat
Ruediger123

Registriert seit: 30. Aug 2011
16 Beiträge
 
#7

AW: Objekte bestimmter Klassen dynamisch erzeugen und freigeben

  Alt 11. Mai 2017, 14:11
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.

Geändert von Ruediger123 (11. Mai 2017 um 14:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
7.892 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Objekte bestimmter Klassen dynamisch erzeugen und freigeben

  Alt 11. Mai 2017, 14:52
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#9

AW: Objekte bestimmter Klassen dynamisch erzeugen und freigeben

  Alt 11. Mai 2017, 15:40
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 AssignTo oder 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 index Keyword umsetzen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
2.766 Beiträge
 
Delphi 2009 Professional
 
#10

AW: Objekte bestimmter Klassen dynamisch erzeugen und freigeben

  Alt 11. Mai 2017, 15:51
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%.
Michael Justin
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 16:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf