Событие в потомке TCollectionItem
Я написал простой код (см. Ниже): потомок TCollectionItem
с событием. Но когда я нажимаю OnDone
событие в объекте инспектора я получаю сообщение:
Msgstr "Невозможно создать метод для неназванного компонента".
Что не так с этим кодом?
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.
1 ответ
Вы забыли включить унаследованный путь имени TMyField
:
function TMyField.GetNamePath: string;
begin
Result := inherited GetNamePath + Format('MyField%d',[Index]);
end;
Кроме того, вы дали неправильный владелец для MyFields
имущество. использование Self
вместо AOwner
, AOwner
это форма, в которую вы добавляете компонент.
constructor TMainComponent2.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FMyFields := TMyFields.Create(Self);
end;
Кстати, почему ты снова ввел TMyFields.Update
? Это разрывает цепочку наследования. использование override
по возможности или добавьте другой метод.