Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi OI: Ungültige Auswahl: 'KollektorItems' hat keinen Besitzer (https://www.delphipraxis.net/83629-oi-ungueltige-auswahl-kollektoritems-hat-keinen-besitzer.html)

oki 5. Jan 2007 09:08


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:
  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;
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.

gruß oki

oki 5. Jan 2007 10:04

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

Khabarakh 5. Jan 2007 10:09

Re: OI: Ungültige Auswahl: 'KollektorItems' hat keinen Besit
 
  • Afair musst du GetOwner überschreiben.
  • inherited Add ergibt nil? Das kann einfach nicht sein, schau dir einmal den VCL-Code an. Du könntest auch versuchen, mit Debug-DCUs zu debuggen.

oki 5. Jan 2007 10:11

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:
  TKollektorItems = class(TCollection)
  private
    FSeyMathObj : TSeyMathObj;
  protected
    function GetOwner: TPersistent; override;

....

function TKollektorItems.GetOwner: TPersistent;
begin
  Result := FSeyMathObj;
end;
Damit ist die Frage beantwortet.

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 02:38 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