【发布时间】:2016-07-21 06:12:13
【问题描述】:
我正在尝试创建一个从 TImage 下降的组件,不同之处在于我可以在属性列表中分配可变数量的 TPictures(不是通过代码分配 TPictures)并通过代码激活其中一个以显示在TImage。
如果有必要在属性中分配所有 TPictures,那么拥有一个设置 TPictures 总数(动态数组的长度)的属性不会有问题。
unit ImageMultiStates;
interface
uses
Vcl.Graphics, Vcl.StdCtrls, System.SysUtils, System.Classes, Vcl.Controls, Vcl.ExtCtrls, Forms;
type
TPictures = Array of TPicture;
TImageMultiStates = class(TImage)
private
FPictures: TPictures;
procedure SetPicture(Which: Integer; APicture: TPicture);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Activate(Which: Integer);
published
property Images: TPictures read FPictures write FPictures; default;
end;
procedure Register;
implementation
constructor TImageMultiStates.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
for TPicture in FPictures do
TPicture := TPicture.Create;
end;
destructor TImageMultiStates.Destroy;
var
APicture: TPicture;
begin
for APicture in FPictures do
APicture.Free;
inherited Destroy;
end;
procedure TImageMultiStates.Activate(Which: Integer);
begin
Picture.Assign(FPictures[Which]);
end;
procedure TImageMultiStates.SetPicture(Which: Integer; APicture: TPicture);
begin // i would also like to use SetPicture instead of "write FPictures"
FPictures[Which].Assign(APicture);
if Which=0 then // because: First Picture will be displayed in the VCL editor
Picture.Assign(FPictures[Which]);
end;
procedure Register;
begin
RegisterComponents('Standard', [TImageMultiStates]);
end;
end.
我在很多方面改变了这段代码,但我真的什么都做不了。
我的组件“Image2States”中确实有同样的想法。然后我需要“Image4States”等等,直到我决定我绝对需要这个带有可变数量的 TPictures...
【问题讨论】:
-
你需要维护一个图片集合。希望能在构造函数中创建图片实例是错误的。
-
@David Heffernan:当然可以。傻我。但除此之外,我在这里尝试的方法可行吗?我应该在属性中设置 TPicture 数量,还是适当的 PropertyEditor 正确显示 TPictures 的集合?
-
我想你想使用一个包含你的图片对象的
TCollection。然后它应该很容易连接到属性编辑器。 -
以防万一,你知道
TImageList,对吗?它可以容纳动态数量的 等尺寸 TImage 支持并具有设计时编辑器的任何类型的图像。限制是图像需要相同大小,默认为 16 x 16,但在将任何图像添加到列表之前,您可以根据需要更改高度和宽度。 -
但是考虑使用 TImageList,如果你有相同大小的图片,例如表示控件的不同状态。 TImageList 甚至可以屏蔽图片,因此如果您不希望它们显示为矩形,它们甚至不必显示为矩形。