![]() |
OI: Ungültige Auswahl: 'KollektorItems' hat keinen Besitzer
Hi Leute,
für mein aktuelles Thema scheinen sich Collections geradezu anzubieten. Nutze ich sonst eher selten. Nun tut sich ein Problem auf, dass wie folgt aussieht. Klicke ich im OI meiner Kompo auf den button hinter meiner eingebundenen Collection, so öffnet sich mit dem Editorfenster für neue Item die im Titel angegebene Fehlermeldung. Quittiere ich diese mit OK, so schließt sich auch das Editorfenster und ich kann keine Item hinzufügen (Editorfenster ist ja weg). Das alles zur Designzeit. Implementiere ich meine Kompo zur Laufzeit, so liefert ein Add ein ungültiges Item zurück (nil). was ist da los? Hier die wichtigsten Code-Ausschnitte:
Delphi-Quellcode:
Ich dachte da kann man nicht viel falsch machen, zumal ich zwar selten, aber eben auch nicht zum ersten mal mit collection arbeite. was ich hier falsch mache hab ich aber bis jetzt aber noch nicht gefunden.
TKollektorItem = class(TCollectionItem)
private FC0: Real; FC1: Real; FC2: Real; FHersteller: String; FName: String; protected public constructor Create(Collection: TCollection); override; procedure AddPropsfromLine(Line : String); published property C0 : Real read FC0 write FC0; property C1 : Real read FC1 write FC1; property C2 : Real read FC2 write FC2; property Hersteller : String read FHersteller write FHersteller; property Name : String read FName write FName; end; TKollektorItems = class(TCollection) private FSeyMathObj : TSeyMathObj; function GetItem(Index: Integer): TKollektorItem; procedure SetItem(Index: Integer; const Value: TKollektorItem); protected public constructor create(AOwner : TSeyMathObj); function Add: TKollektorItem; Function GetKollektorItem(KollTyp : String) : TKollektorItem; property Items[Index: Integer]: TKollektorItem read GetItem write SetItem; default; end; TSeyMathObj = Class(TComponent) private FKollektorItems: TKollektorItems; FKollektorFileName: String; procedure SetKollektorFileName(const Value: String); procedure SetKollektorItems(const Value: TKollektorItems); protected procedure LoadKollektorItems; virtual; public constructor Create(AOwner : TComponent); override; Destructor Destroy; override; // Listen Procedure GetKollektorNames(NameList : TStringList; incl_Herst : Boolean = False); // Berechnungen Function GetWirkungsgrad(KollTyp : String; Tm, Ta, GK : Real):Real; published property KollektorItems : TKollektorItems read FKollektorItems write SetKollektorItems; property KollektorFileName : String read FKollektorFileName write SetKollektorFileName; end; procedure Register; implementation procedure Register; begin RegisterComponents('Seysol', [TSeyMathObj]); end; { TSeyMathObj } constructor TSeyMathObj.Create(AOwner: TComponent); begin inherited create(AOwner); FKollektorItems := TKollektorItems.Create(self); LoadKollektorItems; end; procedure TSeyMathObj.SetKollektorItems(const Value: TKollektorItems); begin FKollektorItems.Assign(Value); end; { TKollektorItems } function TKollektorItems.Add: TKollektorItem; begin Result := TKollektorItem(inherited Add); end; constructor TKollektorItems.create(AOwner: TSeyMathObj); begin inherited create(TKollektorItem); // edit oki FSeyMathObj := AOwner; end; function TKollektorItems.GetItem(Index: Integer): TKollektorItem; begin Result := TKollektorItem(inherited GetItem(Index)); end; procedure TKollektorItems.SetItem(Index: Integer; const Value: TKollektorItem); begin inherited SetItem(Index, Value); end; { TKollektorItem } constructor TKollektorItem.Create(Collection: TCollection); begin inherited create(Collection); FC0 := 0; FC1 := 0; FC2 := 0; FHersteller := ''; FName := ''; end; gruß oki |
Re: OI: Ungültige Auswahl: 'KollektorItems' hat keinen Besit
Hi,
bin schon völlig fertig. Hab jetzt auch mal meine Kompo vom Typ TCustomControl abgeleitet, gleicher Fehler. Hätte ja sein können, dass es an TComponent liegt. Ist es aber nicht. Gruß oki |
Re: OI: Ungültige Auswahl: 'KollektorItems' hat keinen Besit
|
Re: OI: Ungültige Auswahl: 'KollektorItems' hat keinen Besit
Ich hab's :bounce2: :bounce2: :bounce2:
folgende Methode aus TCollection muß wie folgt überschrieben werden:
Delphi-Quellcode:
Damit ist die Frage beantwortet.
TKollektorItems = class(TCollection)
private FSeyMathObj : TSeyMathObj; protected function GetOwner: TPersistent; override; .... function TKollektorItems.GetOwner: TPersistent; begin Result := FSeyMathObj; end; Gruß oki PS: dank und Gruß an Khabarakh. Da waren wir zeitgleich, aber wenn ich es just in diesem Moment nicht gefunden hätte, dann wärst du mein Retter gewesen. Dank und Gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:45 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