Einzelnen Beitrag anzeigen

HeZa

Registriert seit: 4. Nov 2004
Ort: Dortmund
182 Beiträge
 
Delphi 10 Seattle Professional
 
#7

Re: TCollection speichert nicht im DFM, was fehlt?

  Alt 16. Apr 2010, 16:40
@Andreas:

Zitat von Andreas L.:
@Heza: So sollte der constructor von TCollection nicht überschrieben werden
Doch, so sollte das gemacht werden (siehe z.B. THeaderSection in ComCtrls).

Zitat von Andreas L.:
Und da liegt auch nicht der Fehler
Das ist allerdings richtig.

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:
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.
Ciao HeZa
  Mit Zitat antworten Zitat