AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Speichern eines Objekts mit einer Liste von Objekten im DFM
Thema durchsuchen
Ansicht
Themen-Optionen

Speichern eines Objekts mit einer Liste von Objekten im DFM

Ein Thema von RSE · begonnen am 13. Apr 2010 · letzter Beitrag vom 16. Apr 2010
Antwort Antwort
RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#1

Speichern eines Objekts mit einer Liste von Objekten im DFM

  Alt 13. Apr 2010, 09:12
Hallo!

Ich entwickle gerade eine neue Komponente und beschäftige mich nun erstmals mit Property Editoren, Component Editoren, der Speicherung von eigenen Objekten im DFM etc.

Hintergrundinfos:
Meine Komponente (TMyComp) hat eine Items-Property, in der ein Objekt (TMyItemList) gespeichert ist, welches eine Liste von eigenen Objekten (TMyItem) in einem dynamischen Array verwaltet. Die Eigenschaft TMyComp.Items soll im Objektinspektor angezeigt werden, um an den Component Editor ranzukommen, weiter nichts (Realisierung ist bereits geglückt). In diesem Component Editor wird TMyItemList mit TMyItems gefüllt, ähnlich wie bei einer ActionList. Später möchte ich die TMyItem-Objekte auch im Objektinspektor anzeigen können, wenn sie in meinem Component Editor ausgewählt sind.

Fragen:
Wie muss ich TMyComp.Items, welches vom Typ TMyItemList ist, im DFM speichern? Wie muss ich die TMyItem-Objekte in TMyItemList speichern, damit ich sie später im OI anzeigen lassen kann? Ich habe schon DefineProperties (Eigene Property - Zur Runtime wieder zurückgesetzt) gefunden und mir die Hilfe dazu durchgelesen, bin mir allerdings noch etwas unsicher, ob das die richtige Lösung für mich ist und wie ich das anwenden muss (in TMyComp für Items und in TMyItemList für das Array-Property mit den TMyItem-Objekten?).

Delphi-Quellcode:
TMyItem = class // könnte man auch z.B. von TComponent ableiten, wenn notwendig
  ...
end;

TMyItemList = class // könnte man auch z.B. von TComponent ableiten, wenn notwendig
  private
    FItems: array of TMyItem;
  protected
    function GetItem(Index: Integer): TChoiceGroupItem;
    ...
  public
    procedure Clear;
    function Count: Integer;
    procedure Delete(AIndex: Integer);
    ...
    property Item[Index: Integer]: TMyItem read GetItem; default;
end;

TCustomMyComp = class(TCustomControl)
  private
    FItems: TMyItemList;
    ...
  public
    ...
    property Items: TMyItemList read FItems;
end;
Umgebung: Delphi 5 auf WinXP
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Speichern eines Objekts mit einer Liste von Objekten im

  Alt 13. Apr 2010, 09:48
WIMRE sind für das Streaming von Listen Delphi-Referenz durchsuchenTCollection und Delphi-Referenz durchsuchenTCollectionItem gedacht.
Uli Gerhardt
  Mit Zitat antworten Zitat
RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#3

Re: Speichern eines Objekts mit einer Liste von Objekten im

  Alt 13. Apr 2010, 10:30
Danke für den Hinweis, ich werd mir die Klassen mal ansehen.
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat
RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#4

Re: Speichern eines Objekts mit einer Liste von Objekten im

  Alt 13. Apr 2010, 12:09
Jetzt weiß ich wieder, was mich an diesen vorgefertigten Listen immer stört: Wenn ich mir ein Item zurückgeben lasse, dann ist das vom Typ TCollectionItem und nicht von meinem Typ TMyItem. Dadurch muss ich immer erst einen Typecast durchführen, bevor ich auf meine Eigenschaften zugreifen kann.
Delphi-Quellcode:
MyItemList.ItemClass(MyItemList.Items[2]).MyProperty := 'was'; // mit TCollection
MyItemList[2].MyProperty := 'was'; // eigene Lösung mit Items als default Property
Dem Nutzer meiner Komponente kann ich das wohl kaum abverlangen. Das heißt ich müsste die Collection komplett kapseln. Ist das wirklich so gedacht?

Wenn ich meine von TCollection und TCollectionItem abgeleiteten Klassen so vergewaltige, dass der Rückgabetyp TMyItem statt TCollection ist (Konstruktor, Add, Items etc. mit neuen Versionen verdecken und diverse Aufrufe umbauen), dann wird wohl der mitgelieferte Editor auch nicht mehr funktionieren. Vielleicht ergeben sich sogar noch mehr und unlösbare Fehler daraus...

Mein Fazit: Der Weg über TCollection ist Mist.

Also: Überzeugt mich vom Gegenteil oder beantwortet meine ursprüngliche Frage.
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Speichern eines Objekts mit einer Liste von Objekten im

  Alt 13. Apr 2010, 12:23
Zitat von RSE:
Jetzt weiß ich wieder, was mich an diesen vorgefertigten Listen immer stört: Wenn ich mir ein Item zurückgeben lasse, dann ist das vom Typ TCollectionItem und nicht von meinem Typ TMyItem. Dadurch muss ich immer erst einen Typecast durchführen, bevor ich auf meine Eigenschaften zugreifen kann.
Aber dafür kommt die Treamingkomponente mit deinen Items und Itemlisten klar und du bekommt recht einfach deine Objekte in die DFM rein

Klar geht es auch irgendwie ohne, aber dann muß sich deine "Mutterkomponente" selber um das (De)Serialisieren der Listen und Komponenten kümmern.

TTreeView macht das z.B.
und der Dank ist, daß die selbstgestreamten Daten sich seit Delphi 2009 geändert haben und eine in Delphi 7 gefüllte (im Formeditor) TreeView in D2010 urplötzlich kompett lehr ist, weil die TreeView die alten Daten nicht mehr erkennt.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Speichern eines Objekts mit einer Liste von Objekten im

  Alt 13. Apr 2010, 12:24
Zitat von RSE:
Jetzt weiß ich wieder, was mich an diesen vorgefertigten Listen immer stört: Wenn ich mir ein Item zurückgeben lasse, dann ist das vom Typ TCollectionItem und nicht von meinem Typ TMyItem. Dadurch muss ich immer erst einen Typecast durchführen, bevor ich auf meine Eigenschaften zugreifen kann.
Delphi-Quellcode:
MyItemList.ItemClass(MyItemList.Items[2]).MyProperty := 'was'; // mit TCollection
MyItemList[2].MyProperty := 'was'; // eigene Lösung mit Items als default Property
Dem Nutzer meiner Komponente kann ich das wohl kaum abverlangen. Das heißt ich müsste die Collection komplett kapseln. Ist das wirklich so gedacht?
Klar ist das so gedacht. Schau dir halt mal an, wo die VCL TCollection verwendet (z.B. TStatusPanels) - das ist schon machbar.

Zitat von RSE:
Wenn ich meine von TCollection und TCollectionItem abgeleiteten Klassen so vergewaltige, dass der Rückgabetyp TMyItem statt TCollection ist (Konstruktor, Add, Items etc. mit neuen Versionen verdecken und diverse Aufrufe umbauen), dann wird wohl der mitgelieferte Editor auch nicht mehr funktionieren. Vielleicht ergeben sich sogar noch mehr und unlösbare Fehler daraus...

Mein Fazit: Der Weg über TCollection ist Mist.

Also: Überzeugt mich vom Gegenteil oder beantwortet meine ursprüngliche Frage.
Ich werd jetzt nicht ewig versuchen, dich zu deinem Glück zu zwingen. Aber wenn ich Komponenten für Delphi schreibe, würde ich auch den Delphi-Weg dabei gehen. Wie gesagt - in den VCL-Sourcen gibt's genug Beispiele.
Uli Gerhardt
  Mit Zitat antworten Zitat
RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#7

Re: Speichern eines Objekts mit einer Liste von Objekten im

  Alt 13. Apr 2010, 12:36
Ich danke für die Antworten. Das mit der Kapselung ist mir erst kurz vor dem Absenden des Beitrags eingefallen und dann hab ich´s noch mit reingeschrieben. Je mehr ich jetzt in der Mittagspause drüber nachgedacht habe, desto besser gefällt mir die Variante. Also werde ich die Collection komplett kapseln.

Danke an alle Helfer!
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat
RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#8

Re: Speichern eines Objekts mit einer Liste von Objekten im

  Alt 13. Apr 2010, 16:15
Ich hab mir jetzt VCL-Quelltext angesehen, meine Items so angepasst, dass sie mit dem Property Editor von TCollectionItem erstellt werden können (Konstruktor ohne weitere Parameter etc.) und die Items-Property auf Published gesetzt. Trotzdem sind die erstellten Items weg, wenn ich die Form neu lade.

Was muss ich tun, damit TCollection nun meine Items auch speichert?

Ich nehme mal an, dass mir noch ein Standardkniff fehlt, falls ihr weitere Infos oder Quelltext braucht, bitte fragen.
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat
RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#9

Re: Speichern eines Objekts mit einer Liste von Objekten im

  Alt 16. Apr 2010, 14:00
Da hier keiner mehr antwortet und sich das Thema ja nun auch etwas gewandelt hat, habe ich einen neuen Thread erstellt, in dem nun die Benutzung von TCollection diskutiert werden darf: TCollection speichert nicht im DFM, was fehlt?
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  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:24 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