我试图创建一个从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 ...
最佳答案
您告诉我们,您的方法“行不通”(我想您的意思是“未编译”):那是由于一些语法错误,并且因为您没有使用正确的工具来完成这项工作。
如果您只有相同大小的图片,请考虑使用现有的,经过良好测试并受IDE支持的TImageList
,不要尝试重新发明轮子。
尝试...
但是,如果必须包含不同尺寸的图片列表,请使用TObjectList
而不是array of TPicture
。 TObjectLists允许您添加,删除,查询等对象,并且可以根据需要自动释放它们。
如果您的编译器支持泛型,则包括System.Generics.Collections并使用TObjectList<TPicture>
来管理图片。这样,您就不必强制转换为TPicture
,因为泛型列表是类型安全的。
如果它不支持它们,则包括单位Contnrs并使用TObjectList
。从该列表中读取内容时,您将必须使用as
,即as TPicture
进行转换,否则可以执行类似的操作。
最后...
您的类型名称使我认为您仅需要针对某个控件的多个状态。在那种情况下,我认为TImageList
是完成这项工作的最佳工具(并且已经是具有类似需求的其他控件的工具),因此无需自己制作一个。但是,如果要创建自己的数组,请不要使用动态数组,也不要产生像for TPicture in FPictures do
这样的循环。帮自己一个忙,并使用对象列表。
结束