@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