【发布时间】:2016-07-21 12:31:29
【问题描述】:
我正在尝试创建一个 VCL 组件,它允许您插入多个不同大小的 TImage 作为属性。 有人告诉我最好使用 TObjectList (Delphi component with a variable amount of TPictures),但现在我正在努力使单个 TPictures 可在属性编辑器中分配。
我现在拥有的:(它编译)
unit ImageMultiStates;
interface
uses
Vcl.Graphics, Vcl.StdCtrls, System.SysUtils, System.Classes, Vcl.Controls, Vcl.ExtCtrls, Forms, Generics.Collections;
type
TImageMultiStates = class(TImage)
private
FPictures: TObjectList<TPicture>;
procedure SetPicture(Which: Integer; APicture: TPicture);
function GetPicture(Which: Integer): TPicture;
public
Count: integer;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Activate(Which: Integer);
published
// property Pictures: TObjectList<TPicture> read GetPicture write SetPicture;
// property Pictures[Index: Integer]: TObjectList<TPicture> read GetPicture write SetPicture;
property Pictures: TObjectList<TPicture> read FPictures write FPictures;
end;
procedure Register;
implementation
constructor TImageMultiStates.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FPictures := TObjectList<TPicture>.Create;
end;
destructor TImageMultiStates.Destroy;
begin
FPictures.Free;
inherited Destroy;
end;
procedure TImageMultiStates.SetPicture(Which: Integer; APicture: TPicture);
begin
FPictures[Which] := APicture;
if Which=0 then
Picture.Assign(APicture);
end;
function TImageMultiStates.GetPicture(Which: Integer): TPicture;
begin
Result := FPictures[Which];
end;
procedure TImageMultiStates.Activate(Which: Integer);
begin
Picture.Assign(FPictures[Which]);
end;
procedure Register;
begin
RegisterComponents('Standard', [TImageMultiStates]);
end;
end.
不工作的是 PropertyEditor 中的最终结果。它显示一个名为“Pictures”的项目,其值为“(TObjectList)”。单击它不会做任何事情,我没有得到合适的编辑器。有问题的行的其他想法已被注释掉,它们带来了其他错误: 第一个抛出编译器错误“E2008 Incompatible Types”,第二个抛出“Published property 'Pictures' can not be of type ARRAY”。
【问题讨论】:
-
我不确定您是否可以将泛型用作已发布的属性(我不确定您也不能,顺便说一句)。您是否有理由不只是使用 TOwnedCollection,流系统知道如何处理?并且发布的属性不能是数组类型;你可以有一个带有 getter/setter 的 public 数组属性,但不能 published。
-
您应该使用我在 cmets 中对您上一个问题所说的集合
-
我喜欢 TObjectList 的建议,以防止复杂性。好的,下一个方法从集合开始。干杯!
-
@David 是对的。他不是指像 Generics.Collections 这样的集合,他指的是 VCL TCollection。此类旨在用于多个项目(例如状态栏中的面板或列表视图标题中的列 - 这些都作为 TCollection 的后代实现)..
-
因为 IDE 特别允许在设计时编辑基于
TCollection的属性,并且 DFM 流系统也支持TCollection。 Generic 集合无法获得同样的支持。