Announcement

Collapse
No announcement yet.

Problem beim Aufruf von TCollection - Properties

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem beim Aufruf von TCollection - Properties

    Hallo,

    TCollection/TCollectionitems:

    Bei folgenden Beispiel erhalte ich nicht die Möglichkeit die Collectionitems zu verändern, bzw. den entsprechenden Propertyeditor dafür aufzurufen.

    <PRE>
    unit UCollectionTest;
    <PRE>
    interface
    <PRE>
    uses Windows, Messages, SysUtils, Classes, Controls;
    <PRE>
    type
    TFeld = class (TCollectionItem)
    <PRE>
    private
    fFeldName: String;
    <PRE>
    published
    property FeldName: String read fFeldName write fFeldName;
    end;
    <PRE>
    type
    TFelder = class (TCollection)
    private
    fOwner : TFeld;
    function GetItem(i: Integer): TFeld;
    <PRE>
    protected
    procedure Update(Item: TCollectionItem); override;
    <PRE>
    public
    constructor Create(AOwner: TPersistent; ItemClass: TCollectionItemClass);
    property Items [i : Integer] : TFeld read GetItem; default;
    function Add : TFeld;
    <PRE>
    {$ifndef VER140}
    property Owner : TScopeItem read fOwner;
    {$endif}
    published
    end;
    <PRE>
    type
    TCollectionTest=class(TComponent)
    <PRE>
    private
    fFelder: TFelder;
    <PRE>
    published
    property Felder: TFelder read fFelder write fFelder;
    end;
    <PRE>
    procedure Register;
    <PRE>
    implementation
    <PRE>
    procedure Register;
    begin
    RegisterComponents ('GOERLITZ', [TCollectionTest]);
    end;
    <PRE>
    function TFelder.GetItem(i: Integer): TFeld;
    begin
    result := inherited Items [i] as TFeld;
    end;
    <PRE>
    constructor TFelder.Create(AOwner: TPersistent; ItemClass: TCollectionItemClass);
    begin
    fOwner := TFeld (AOwner);
    inherited Create (ItemClass);
    end;
    <PRE>
    function TFelder.Add: TFeld;
    begin
    result := inherited Add as TFeld;
    end;
    <PRE>
    procedure TFelder.Update(Item: TCollectionItem);
    begin
    inherited Update(Item);
    end;
    <PRE>
    end.
    </PRE>

    Gruß, Tom

  • #2
    Hallo Tom,

    der Owner für eine TCollection kann kein TCollectionItem sein!
    Als Owner mußt Du hier den "Besitzer" d.h. die Komponente angeben.
    Damit die Kollektion deine Komponente kennt musst Du sie vorwärts deklarieren damit die Kollektion sie "kennt".
    Füge vor der Deklaration von TFeld ( TFeld = class... ) die folgende Zeile ein.

    TCollectionTest = class;

    mfg Holge

    Comment


    • #3
      Hallo Holger,

      Vielen Dank für Deine prompte Antwort,

      Hier noch mal eine funktionierende Version:
      <B>
      <PRE>
      unit UCollectionTest;
      <PRE>
      interface
      <PRE>
      uses Windows, Messages, SysUtils, Classes, Controls;
      <PRE>
      type
      TCollectionParent=class;
      <PRE>
      TFeld=class(TCollectionItem)
      private
      fFeldName: String;
      fFeldIndex: Integer;
      <PRE>
      public
      constructor Create(Collection: TCollection); override;
      destructor Destroy; override;
      <PRE>
      protected
      procedure AssignTo (Dest: TPersistent); override;
      function GetOwner: TPersistent; override;
      <PRE>
      published
      property FeldName: String read fFeldName write fFeldName;
      property FeldIndex: Integer read fFeldIndex write fFeldIndex;
      end;
      <PRE>
      TFelder=class(TCollection)
      private
      fOwner: TCollectionParent;
      function GetItem(i: Integer): TFeld;
      <PRE>
      public
      constructor Create(AOwner: TPersistent; ItemClass: TFeld);
      property Items [i: Integer]: TFeld read GetItem; default;
      function Add: TFeld;
      {$ifndef VER140}property Owner: TFeld read fOwner;{$endif}
      <PRE>
      protected
      procedure Update(Item: TCollectionItem); override;
      <PRE>
      published
      end;
      <PRE>
      TCollectionParent=class(TComponent)
      private
      fFelder: TFelder;
      function GetFelder: TFelder;
      procedure SetFelder(Value: TFelder);
      <PRE>
      published
      property Felder: TFelder read GetFelder write SetFelder;
      end;
      <PRE>
      procedure Register;
      <PRE>
      implementation
      <PRE>
      procedure Register;
      begin
      RegisterComponents ('GOERLITZ', [TCollectionParent]);
      end;
      <PRE>
      constructor TFeld.Create(Collection: TCollection);
      begin
      inherited Create(Collection);
      end;
      <PRE>
      destructor TFeld.Destroy;
      begin
      inherited Destroy;
      end;
      <PRE>
      procedure TFeld.AssignTo(Dest: TPersistent);
      begin
      end;
      <PRE>
      function TFeld.GetOwner: TPersistent;
      begin
      Result := Collection.Owner;
      end;
      <PRE>
      constructor TFelder.Create(AOwner: TPersistent; ItemClass: TFeld);
      begin
      fOwner := TCollectionParent (AOwner);
      inherited Create(TFeld);
      end;
      <PRE>
      function TFelder.GetItem(i: Integer): TFeld;
      begin
      result := inherited Items [i] as TFeld;
      end;
      <PRE>
      function TFelder.Add: TFeld;
      begin
      result := inherited Add as TFeld;
      end;
      <PRE>
      procedure TFelder.Update(Item: TCollectionItem);
      begin
      inherited Update(Item);
      end;
      <PRE>
      function TCollectionParent.GetFelder: TFelder;
      begin
      if fFelder=nil
      then fFelder:=TFelder.Create(self, nil);
      Result:=fFelder;
      end;
      <PRE>
      procedure TCollectionParent.SetFelder(Value: TFelder);
      begin
      GetFelder.Assign(Value);
      end;
      <PRE>
      end.
      </PRE>
      </B&gt

      Comment

      Working...
      X