gpt4 book ai didi

delphi - Delphi组件具有可变数量的图片

转载 作者:行者123 更新时间:2023-12-03 19:49:43 25 4
gpt4 key购买 nike

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

关于delphi - Delphi组件具有可变数量的图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38496203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com