![]() |
TCollection speichert nicht im DFM, was fehlt?
Hallo,
ich bin dabei eine eigene Komponente zu entwickeln. Erstmalig tritt nun der Fall auf, dass ich eine Liste eigener Unterobjekte in meiner Komponente speichern muss. Dazu wurde mir im Thread ![]()
Delphi-Quellcode:
Die Property vom Typ TMyItemList ist published, der Property Editor von TCollection wird angezeigt und ich erstelle meine Items damit. Wenn ich allerdings die Form neu öffne (so dass er die Items aus der DFM laden müsste), sind sie nicht da. In der DFM wird auch nichts weiter erstellt (Unterobjekteintäge für meine Items).
TMyItem = class(TCollectionItem)
... end; TMyItemList = class(TCollection) private FItems: array of TMyItem; protected function GetItem(AIndex: Integer): TMyItem; procedure SetItem(AIndex: Integer; AItem: TMyItem); ... public ... function Add: TCollectionItem; overload; function Add({eigene Argumente für Initialisierung}): TMyItem; overload; property Items[Index: Integer]: TMyItem read GetItem write SetItem; default; end; TCustomMyComp = class(TCustomControl) private FItems: TMyItemList; ... public ... property Items: TMyItemList read FItems; end; Was muss ich tun, damit meine Items auch in der DFM gespeichert werden, wenn sie zur Entwurfszeit mit dem Property Editor von TCollection erstellt werden? |
Re: TCollection speichert nicht im DFM, was fehlt?
du brauchst noch eine private variable FOwner vom Typ TComponent in TMyItemList und musst dann noch die beiden nachfolgenden Prozeduren wie folgt überschreiben.
Delphi-Quellcode:
TCustomMyComp muss TMyItemList dann wie folgt initialisieren (wenn du es nicht bereits so gemacht hast):
constructor TMyItemList.Create(AOwner: TComponent);
begin inherited Create(TOurCollectionItem); FOwner := AOwner; end; function TMyItemList.GetOwner: TPersistent; begin Result := FOwner; end;
Delphi-Quellcode:
Ansonsten ist
FItems := TMyItemList.Create(self);
![]() Viel Erfolg noch. Ciao HeZa |
Re: TCollection speichert nicht im DFM, was fehlt?
Ich sehe gerade noch, die Funktion Add (ohne Parameter) sollte auch den Rückgabetyp TMyItem haben. Also so:
Delphi-Quellcode:
Viel Spaß
function Add: TMyItem; overload;
Ciao HeZa |
Re: TCollection speichert nicht im DFM, was fehlt?
@Heza: So sollte der constructor von TCollection nicht überschrieben werden! Und da liegt auch nicht der Fehler ;-)
Die Daten werden nicht gespeichert weil die Eigenschaft Items als default-Eigenschaft definiert wird. Versuchs so:
Delphi-Quellcode:
property Items[Index: Integer]: TMyItem read GetItem write SetItem;
|
Re: TCollection speichert nicht im DFM, was fehlt?
Keiner der Vorschläge führt zum Erfolg. Ich werde eine neue Komponente bauen, die sonst keine Funktionalität enthält und das erneut testen. Diese werde ich, wenn sie nicht funktioniert, hier komplett posten. Weitere Vorschläge sind weiterhin willkommen.
|
Re: TCollection speichert nicht im DFM, was fehlt?
Lösung: Die Items-Property in TCustomMyComp darf nicht readonly sein. Es muss auch ein Setter existieren:
Delphi-Quellcode:
TCustomMyComp = class(TCustomControl)
private FItems: TMyItemList; ... public ... property Items: TMyItemList read FItems write FItems; // incl. write, nicht wie im 1. Beitrag ohne end; |
Re: TCollection speichert nicht im DFM, was fehlt?
@Andreas:
Zitat:
Zitat:
Es liegt wohl eher daran das er in der Komponente seine Collection Eigenschaft nicht im published-Teil stehen hat. Mit dem folgenden Source habe ich auf jedenfall erfolgreich eine Komponente mit Collection-Eigenschaft programmiert (getestet unter D2010, sollte aber keine Rolle spielen)
Delphi-Quellcode:
Ciao HeZa
unit MyComponents;
interface uses SysUtils, Classes; type TMyCollectionItem = class(TCollectionItem) private FData: String; public procedure Assign(Source: TPersistent); override; published property Data: String read FData write FData; end; TMyCollection = class(TCollection) private FOwner: TComponent; function GetItems(Index: Integer): TMyCollectionItem; procedure SetItems(Index: Integer; Value: TMyCollectionItem); protected function GetOwner: TPersistent; override; public constructor Create(Owner: TComponent); function Add: TMyCollectionItem; property Items[Index: Integer]: TMyCollectionItem read GetItems write SetItems; default; end; TMyComponent = class(TComponent) private FItems: TMyCollection; procedure SetItems(const Value: TMyCollection); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property Items: TMyCollection read FItems write SetItems; end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [TMyComponent]); end; { TMyCollectionItem } procedure TMyCollectionItem.Assign(Source: TPersistent); begin if Source is TMyCollectionItem then Data := TMyCollectionItem(Source).data else inherited; end; { TMyCollection } constructor TMyCollection.Create(Owner: TComponent); begin inherited Create(TMyCollectionItem); FOwner := Owner; end; function TMyCollection.Add: TMyCollectionItem; begin Result := inherited Add as TMyCollectionItem; end; function TMyCollection.GetItems(Index: Integer): TMyCollectionItem; begin Result := GetItem(Index) as TMyCollectionItem; end; function TMyCollection.GetOwner: TPersistent; begin Result := FOwner; end; procedure TMyCollection.SetItems(Index: Integer; Value: TMyCollectionItem); begin SetItem(Index, Value); end; { TMyComponent } constructor TMyComponent.Create(AOwner: TComponent); begin inherited; FItems := TMyCollection.Create(self); end; destructor TMyComponent.Destroy; begin FreeAndNil(FItems); inherited; end; procedure TMyComponent.SetItems(const Value: TMyCollection); begin FItems := Value; end; end. |
Re: TCollection speichert nicht im DFM, was fehlt?
Zitat:
Delphi-Quellcode:
Und die Eigenschaft Items, steht nicht im published Teil? Hmm...
TCustomMyComp = class(TCustomControl)
... public ... property Items: TMyItemList read FItems write FItems; // incl. write, nicht wie im 1. Beitrag ohne end; Es würde mich auch noch interessieren, ob du GetOwner überschrieben hast? Ciao Heinz Z. |
Re: TCollection speichert nicht im DFM, was fehlt?
In TCustomMyComp steht es im public, aber in TMyComp ist es dann published ;-)
TMyItem.GetOwner ist auch überschrieben, hatte ich vergessen mit hinzuschreiben hier. Ich konnte auch den Konstruktor von TMyItemList ändern und wenn ich mich nicht irre (Quelltext liegt auf Arbeit) Items als default deklarieren. Ebenso konnte ich die einfache Add-Methode streichen. Delphi 5 sagt auch nichts wegen überladen. Ich werd Montag mal ausprobieren, ob das Add überladen oder verdeckt ist und schreibe das dann hier noch mal rein. Ich wünsche allen ein schönes Wochenende! |
Re: TCollection speichert nicht im DFM, was fehlt?
Sorry, ich hatte gestern vergessen nachzusehen...
Es ist wie ich schrieb:
Und die Komponente läuft. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 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-2025 by Thomas Breitkreuz