我试图创建一个从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这样的循环。帮自己一个忙,并使用对象列表。
结束

09-25 19:56