![]() |
Speichern eines Objekts mit einer Liste von Objekten im DFM
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 ( ![]()
Delphi-Quellcode:
Umgebung: Delphi 5 auf WinXP
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; |
Re: Speichern eines Objekts mit einer Liste von Objekten im
|
Re: Speichern eines Objekts mit einer Liste von Objekten im
Danke für den Hinweis, ich werd mir die Klassen mal ansehen.
|
Re: Speichern eines Objekts mit einer Liste von Objekten im
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. :x
Delphi-Quellcode:
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? :gruebel:
MyItemList.ItemClass(MyItemList.Items[2]).MyProperty := 'was'; // mit TCollection
MyItemList[2].MyProperty := 'was'; // eigene Lösung mit Items als default Property 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. :wink: |
Re: Speichern eines Objekts mit einer Liste von Objekten im
Zitat:
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. :stupid: |
Re: Speichern eines Objekts mit einer Liste von Objekten im
Zitat:
Zitat:
|
Re: Speichern eines Objekts mit einer Liste von Objekten im
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! |
Re: Speichern eines Objekts mit einer Liste von Objekten im
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. |
Re: Speichern eines Objekts mit einer Liste von Objekten im
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:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz