I wrote simple code (see below): a descendant of TCollectionItem with an event. But when I click OnDone event in object inspector I get the message:
"Cannot create a method for an unnamed component".
What is wrong with this code?
unit MainComponent2;
interface
uses Windows, SysUtils, Classes;
type
TMyField = class(TCollectionItem)
private
FName: string;
FOnDone: TNotifyEvent;
FText: string;
protected
function GetDisplayName : String; override;
public
constructor Create(ACollection: TCollection);override;
function GetNamePath: string;override;
published
property Name: string read FName write FName;
property Text: string read FText write FText;
property OnDone: TNotifyEvent read FOnDone write FOnDone;
end;
TMyFields = class(TOwnedCollection)
private
function GetItem(Index: Integer): TMyField;
procedure SetItem(Index: Integer; const Value: TMyField);
protected
procedure Update(Item: TmyField);reintroduce;
public
constructor Create(AOwner: TComponent);
function Add: TMyField;
function Insert(Index: Integer): TMyField;
property Items[Index: Integer]: TMyField read GetItem write SetItem; default;
end;
TMainComponent2 = class(TComponent)
private
FMyFields: TMyFields;
function GetItem(index: integer): TMyField;
procedure SetItem(index: integer; const Value: TMyField);
procedure SetMyFields(const Value: TMyFields);
public
constructor Create(AOwner: TComponent);override;
destructor Destroy;override;
property Items[index: integer]: TMyField read GetItem write SetItem;
published
property MyFields: TMyFields read FMyFields write SetMyFields;
end;
procedure Register;
implementation
{ TMainComponent2 }
constructor TMainComponent2.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FMyFields := TMyFields.Create(AOwner);
end;
destructor TMainComponent2.Destroy;
begin
FMyFields.Free;
inherited;
end;
function TMainComponent2.GetItem(index: integer): TMyField;
begin
result := FMyFields.Items[index] as TMyField;
end;
procedure TMainComponent2.SetItem(index: integer; const Value: TMyField);
begin
FMyFields.Items[index] := Value;
end;
procedure TMainComponent2.SetMyFields(const Value: TMyFields);
begin
FMyFields.Assign(Value);
end;
{ TMyField }
constructor TMyField.Create(ACollection: TCollection);
begin
inherited Create(ACollection);
FName := ClassName + IntToStr(ID);
end;
function TMyField.GetDisplayName: String;
begin
result := FName;
end;
function TMyField.GetNamePath: string;
begin
Result := Format('%s%d',['MyField', Index])
end;
{ TMyFields }
function TMyFields.Add: TMyField;
begin
result := (inherited Add) as TMyField;
end;
constructor TMyFields.Create(AOwner: TComponent);
begin
inherited Create(AOwner, TMyField);
end;
function TMyFields.GetItem(Index: Integer): TMyField;
begin
result := (inherited GetItem(Index)) as TMyField;
end;
function TMyFields.Insert(Index: Integer): TMyField;
begin
result := (inherited Insert(Index)) as TMyField;
end;
procedure TMyFields.SetItem(Index: Integer; const Value: TMyField);
begin
inherited SetItem(Index, Value);
end;
procedure TMyFields.Update(Item: TmyField);
begin
inherited Update(Item);
end;
procedure Register;
begin
RegisterComponents('MyComponents', [TMainComponent2]);
end;
end.
You forgot to include the inherited name path of
TMyField:Also, you have given the wrong owner for the
MyFieldsproperty. UseSelfinstead ofAOwner.AOwneris the form on which you drop the component.B.t.w. Why did you reintroduce
TMyFields.Update? This breaks the inheritance chain. Useoverridewhen possible, or add another method.