Einzelnen Beitrag anzeigen

oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#1

OI: Ungültige Auswahl: 'KollektorItems' hat keinen Besitzer

  Alt 5. Jan 2007, 09:08
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
  Mit Zitat antworten Zitat