【发布时间】:2016-11-25 05:12:00
【问题描述】:
我正在尝试创建一个像 TImage 这样的 VCL 组件,它可以让我添加可变数量的不同大小的 TPictures。 目标是能够通过属性列表中的 VCL 编辑器分配该数量的 TPictures。
delphi component property: TObjectList<TPicture> 在这里我们得出结论,应该使用带有 TCollectionItems 的 TCollection。这就是我现在正在尝试做的事情,但是在我结束编译器错误之前很多次:“发布的属性'图片'不能是类型数组”在这一行中:
property Pictures[Index: Integer]: TPic read GetPic write SetPic;
unit ImageMultiStates;
interface
uses
Vcl.Graphics, Vcl.StdCtrls, System.SysUtils, System.Classes, Vcl.Controls, Vcl.ExtCtrls, Forms, Generics.Collections;
type
TPic = class(TCollectionItem)
private
FPicture: TPicture;
public
procedure Assign(Source: TPersistent); override;
constructor Create(Collection: TCollection); override;
destructor Destroy; override;
published
property Picture: TPicture read FPicture write FPicture;
end;
TPictures = class(TCollection)
private
function GetPic(Index: Integer): TPic;
procedure SetPic(Index: Integer; APicture: TPic);
public
constructor Create;
published
property Pictures[Index: Integer]: TPic read GetPic write SetPic;
end;
TImageMultiStates = class(TImage)
private
FPictures: TPictures;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Activate(Index: Integer);
end;
procedure Register;
implementation
constructor TPic.Create(Collection: TCollection);
begin
inherited Create(Collection);
end;
destructor TPic.Destroy;
begin
FPicture.Free;
inherited Destroy;
end;
procedure TPic.Assign(Source: TPersistent);
begin
FPicture.Assign(Source);
end;
constructor TPictures.Create;
begin
inherited Create(TPic);
end;
procedure TPictures.SetPic(Index: Integer; APicture: TPic);
begin
Items[Index].Assign(APicture);
end;
function TPictures.GetPic(Index: Integer): TPic;
begin
Result := TPic(inherited Items[Index]);
end;
constructor TImageMultiStates.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
end;
destructor TImageMultiStates.Destroy;
begin
FPictures.Free;
inherited Destroy;
end;
procedure TImageMultiStates.Activate(Index: Integer);
begin
Picture.Assign(FPictures.Items[Index]);
end;
procedure Register;
begin
RegisterComponents('Standard', [TImageMultiStates]);
end;
end.
由于似乎没有人期望会引发此错误,因此可能与我安装的组件有关?我使用内部的 GetIt Package-Manager 安装 Jedi Code Library 2.8、Jedi Visual Component Library 和 PNGComponents 1.0。就 TImage 相关的组件而言,我想这就是它。也许其中之一用时髦的东西覆盖了我的一些 TImage 内容......
【问题讨论】:
-
如果您想在设计时使用
Object Inspector分配多个图像,就像编辑任何其他属性一样,那么恐怕您将无法执行此操作。好吧,不能直接使用Object Inspector。您需要做的是创建自己的自定义属性编辑器。我建议检查TImageList组件的源代码,以便更好地了解它是如何完成的。 -
距离我上次使用它已经有一段时间了,但是 IIRC,TCollection 不是这样工作的。看看状态栏如何管理其面板或列表视图如何管理其列标题。 AFAIK,两者都使用 TCollection 的后代。
-
这里有一个很好的解释:atug.com/andypatterns/collections.htm#TCollectionMerits。 Tcollection 最好的部分是它在对象检查器中工作得很好,并且有一个属性编辑器可以让你添加项目。
-
TPic 的构造函数中忘记初始化 FPicture。