Нет реакции, когда "..." щелкает свойство TCollectionItem, представляющее другую коллекцию TCollection.
Я никогда не был в ситуации, когда это было нужно, и я впервые пытаюсь TCollection
как TCollectionItem
другого TCollection
, Все это прекрасно компилируется, но нет никакой реакции, когда три точки позади TCollectionItem
"s TCollection
свойство кликается, т.е. диалог со списком этого субTCollection
не появляются.
У меня сложилось впечатление, что, так как не нужно никаких редакторов причудливой собственности (TCollection
несет только предметы, которые имеют string
и single
свойство), IDE в значительной степени будет обрабатывать его автоматически.
По-видимому, это не так, или я наблюдаю за очевидным, что является хроническим недугом.
Модуль реализации (времени выполнения) имеет следующее:
type
TBitmapItemTag = class(TCollectionItem)
private
FTagName: string;
FTagFloat: Single;
published
property TagName: string read FTagName write FTagName;
property TagFloat: Single read FTagFloat write FTagFloat;
end;
TBitmapItemTags = class(TOwnedCollection)
end;
TBitmapItem = class(TCollectionItem)
private
FBitmap: TBitmap;
FBitmapItemTags: TBitmapItemTags;
public
constructor Create(Collection: TCollection); override;
destructor Destroy; override;
published
property Bitmap: TBitmap read FBitmap write FBitmap;
property Tags: TBitmapItemTags read FBitmapItemTags write FBitmapItemTags;
end;
TBitmaps = class(TCollection)
end;
TBitmapCollection = class(TComponent)
private
FBitmaps: TBitmaps;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Bitmaps: TBitmaps read FBitmaps write FBitmaps;
end;
implementation
{ TBitmapItem }
constructor TBitmapItem.Create(Collection: TCollection);
begin
inherited Create(Collection);
FBitmap := TBitmap.Create(0, 0);
FBitmapItemTags := TBitmapItemTags.Create(Self,TBitmapItemTag);
end;
destructor TBitmapItem.Destroy;
begin
FBitmap.Free;
FBitmapItemTags.Free;
inherited;
end;
{ TBitmapCollection }
constructor TBitmapCollection.Create(AOwner: TComponent);
begin
inherited;
FBitmaps := TBitmaps.Create(TBitmapItem);
end;
destructor TBitmapCollection.Destroy;
begin
FBitmaps.Free;
inherited;
end;
Register
процедура реализована в модуле времени проектирования и просто вызывает RegisterComponents
процедура. И держит ленивый RegisterPropertyEditor
попытки, которые были безрезультатны.
Если кто-то может указать мне кратчайший путь, чтобы среда IDE могла распознать TBitmapItemTag TCollectionItem
Буду благодарен.
1 ответ
Вам нужно изменить TBitmaps
извлечь из TOwnedCollection
вместо TCollection
,
Я также предлагаю определить явные конструкторы для TBitmapItemTags
а также TBitmaps
,
Вам также необходимо добавить некоторые методы установки в свойства объектов, в противном случае вы рискуете утечки памяти во время выполнения. Ваши сеттеры должны звонить Assign()
на ваших объектах, чтобы скопировать значения свойств из одного объекта в другой. TCollection
уже реализует Assign()
для вас, но вам придется реализовать Assign()
в вашей коллекции предметов.
Попробуй это:
type
TBitmapItemTag = class(TCollectionItem)
private
FTagName: string;
FTagFloat: Single;
public
procedure Assign(ASource: TPersistent); override;
published
property TagName: string read FTagName write FTagName;
property TagFloat: Single read FTagFloat write FTagFloat;
end;
TBitmapItem = class;
TBitmapItemTags = class(TOwnedCollection)
public
constructor Create(AOwner: TBitmapItem); reintroduce;
end;
TBitmapItem = class(TCollectionItem)
private
FBitmap: TBitmap;
FTags: TBitmapItemTags;
procedure SetBitmap(AValue: TBitmap);
procedure SetTags(AValue: TBitmapItemTags);
public
constructor Create(Collection: TCollection); override;
destructor Destroy; override;
procedure Assign(ASource: TPersistent); override;
published
property Bitmap: TBitmap read FBitmap write SetBitmap;
property Tags: TBitmapItemTags read FTags write SetTags;
end;
TBitmapCollection = class;
TBitmaps = class(TOwnedCollection)
public
constructor Create(AOwner: TBitmapCollection); reintroduce;
end;
TBitmapCollection = class(TComponent)
private
FBitmaps: TBitmaps;
procedure SetBitmaps(AValue: TBitmaps);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Bitmaps: TBitmaps read FBitmaps write SetBitmaps;
end;
{ TBitmapTagItem }
procedure TBitmapItemTag.Assign(ASource: TPersistent);
begin
if ASource is TBitmapItemTag then
begin
FTagName := TBitmapItemTag(ASource).TagName;
FTagFloat := TBitmapItemTag(ASource).TagFloat;
end
else
inherited;
end;
{ TBitmapItemTags }
constructor TBitmapItemTags.Create(AOwner: TBitmapItem);
begin
inherited Create(AOwner, TBitmapItemTag);
end;
{ TBitmapItem }
constructor TBitmapItem.Create(Collection: TCollection);
begin
inherited Create(Collection);
FBitmap := TBitmap.Create(0, 0);
FTags := TBitmapItemTags.Create(Self);
end;
destructor TBitmapItem.Destroy;
begin
FBitmap.Free;
FTags.Free;
inherited;
end;
procedure TBitmapItem.Assign(ASource: TPersistent);
begin
if ASource is TBitmapItem then
begin
FBitmap.Assign(TBitmapItem(ASource).Bitmap);
FTags.Assign(TBitmapItem(ASource).Tags);
end
else
inherited;
end;
procedure TBitmapItem.SetBitmap(AValue: TBitmap);
begin
FBitmap.Assign(AValue);
end;
procedure TBitmapItem.SetTags(AValue: TBitmapItemTags);
begin
FTags.Assign(AValue);
end;
{ TBitmaps }
constructor TBitmaps.Create(AOwner: TBitmapCollection);
begin
inherited Create(AOwner, TBitmapItem);
end;
{ TBitmapCollection }
constructor TBitmapCollection.Create(AOwner: TComponent);
begin
inherited;
FBitmaps := TBitmaps.Create(Self);
end;
destructor TBitmapCollection.Destroy;
begin
FBitmaps.Free;
inherited;
end;
procedure TBitmapCollection.SetBitmaps(AValue: TBitmaps);
begin
FBitmaps.Assign(AValue);
end;