首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >具有可变数量的TPictures的Delphi组件

具有可变数量的TPictures的Delphi组件
EN

Stack Overflow用户
提问于 2016-07-20 22:12:13
回答 2查看 289关注 0票数 1

我正在尝试创建一个从TImage降下来的组件,其不同之处在于,我可以在属性列表中分配一个可变数量的TPictures (而不是按代码分配TPictures ),并通过要在TImage中显示的代码激活其中的一个。

如果有必要在属性中分配所有的TPictures,那么设置一个设置动态数组的总数量(动态数组的长度)的属性就没有问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.

我在很多方面改变了这段代码,但我真的无法得到任何东西。

在我的组件“Image2State”中,我确实有同样的想法。然后我需要'Image4States‘等等,直到我决定我绝对需要一个可变数量的TPictures.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-21 00:53:15

您告诉我们,您的方法“不起作用”(我猜您的意思是“没有编译”):这是因为一些语法错误,而且您没有在工作中使用正确的工具。

如果您只有相同大小的图片,那么请考虑使用已经存在的、经过良好测试和IDE支持的TImageList,不要试图重新发明轮子。

试着..。

但是,如果您必须有一个大小不同的图片列表,则使用TObjectList而不是array of TPicture。TObjectLists允许您添加、删除、查询等对象,如果您愿意,它们可以自动释放它们。

如果编译器支持泛型,则包含System.Generics.Collections并使用TObjectList<TPicture>来管理图片。这样,您就不必强制转换为TPicture,因为泛型列表是类型安全的。

如果不支持它们,请包含单元Contnrs并使用TObjectList。当从该列表中读取时,您将不得不使用as (即as TPicture )进行强制转换,但否则您可以做类似的事情。

终于..。

您类型的名称使我认为您只需要一个特定控件的多个状态。在这种情况下,我认为TImageList是作业的最佳工具(而且它已经适用于具有类似需求的其他控件),并且不需要自己制作一个。但是,如果您想创建自己的数组,就不要使用动态数组,也不要像使用for TPicture in FPictures do的循环那样产生循环。帮你自己一个忙,并使用一个对象列表。

结束

票数 1
EN

Stack Overflow用户

发布于 2016-07-20 22:26:12

我回答这个问题时会问:你期望这样做是什么?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for TPicture in FPictures do
  TPicture := TPicture.Create;

首先,正如所写的,这根本不编译。没有声明TPicture循环变量(即使声明了该变量,与类型名称相同也会导致后续编译错误)。

即使假设循环是有效的、可编译的代码,当构造函数执行FPictures时也是一个空数组,因此这个循环将执行0(0)次。您没有显示任何代码来告诉组件它应该支持多少张图片,所以它总是支持0(零)。

问题不会就此结束。

如果您确实声明了一个适当的变量作为循环变量,则循环代码仍然不会编译,因为它涉及到不允许的对循环变量的赋值。

即使在简单的for-循环以及基于迭代器的循环(如您试图使用的循环)中也是如此。在简单循环的情况下,这是为了使编译器能够产生最佳代码。在迭代器循环的情况下,它还可以保护您免受错误的影响,否则可能很容易出错。

在本例中,在循环的每次迭代中,您将创建一个新的TPicture实例,并将其分配给循环变量,但这会使而不是将其分配给初始化循环变量的数组中的项。

也许解释这一点的最简单的方法是“展开循环”(展开循环是为每次迭代显式重写代码,就好像根本没有循环一样)。

因此,请考虑循环是否包含两个项,并让我们还更改循环变量的名称,以使内容既有效又清晰。我们将使用简单的图片。换句话说,我们将展开这个循环的2迭代版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for pic in FPictures do  // fPictures contains 2 items
  pic := TPicture.Create;

请记住,这是而不是编译,如果可能的话,在展开它将创建的循环时,这有助于防止我们犯错误的原因是显而易见的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Iteration #1
pic := fPictures[0];
pic := TPicture.Create;

// Iteration #2
pic := fPictures[1];
pic := TPicture.Create;

希望你能看到问题所在。您可以在每次迭代中重写循环变量的值,但这不会修改数组项本身。更糟糕的是,循环的每一次迭代都泄漏了一个TPicture

希望这能帮助您理解为什么您的代码不能工作(实际上,无法工作),并做出必要的更正。

  1. 您需要一些机制来设置组件支持的图片数量。
  2. 您需要正确初始化保存这些图片的数组中的项。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38496203

复制
相关文章
「R」ggplot2在R包开发中的使用
没有特别系统的学习 tidy evaluation 这方面的高级操作,最近有空准备补一补,学习下这方面的知识。
王诗翔呀
2022/03/30
6.7K0
集成光路中的光栅
所谓光栅,就是通过一定的微加工手段,使得材料的折射率满足一定的分布,从而实现对光操控的一类光器件。典型的光栅结构,示意图如下,
光学小豆芽
2020/08/14
2.3K0
对SVG动画进行异步懒光栅化处理 [每日前端夜话(0x17)]
在转换 SVG 图像时,浏览器会试着在每一帧上进行渲染,以便使图像尽可能的清晰。 不幸的是,SVG渲染可能会很慢,特别是对于较大的图像。
疯狂的技术宅
2019/03/27
1.3K0
对SVG动画进行异步懒光栅化处理 [每日前端夜话(0x17)]
光栅图形学的中的算法
——对《计算机图形学基础教程》胡事民等著 的补充
种花家的奋斗兔
2020/11/13
1.2K0
光栅图形学的中的算法
网页光栅化_光栅净化
资料:https://blog.csdn.net/luoshengyang/article/details/51348829
全栈程序员站长
2022/11/01
2440
在Exce中使用带有动态数组公式的切片器
Excel中,有一些特别的函数仅计算可见行,例如SUBTOTAL函数和AGGREGATE函数。本文示例使用SUBTOTAL函数。
fanjy
2023/08/29
5160
在Exce中使用带有动态数组公式的切片器
原 在PostgreSQL中秒级完成大表添加带有not null属性并带有default值的实验
近期同事在讨论如何在PostgreSQL中一张大表,添加一个带有not null属性的,且具有缺省值的字段,并且要求在秒级完成。 因为此,有了以下的实验记录: 首先我们是在PostgreSQL 10下做的实验: postgres=# select version(); version ---------------
王果壳
2018/05/17
8.2K0
sql中带有like时如何使用预编译。
Java代码如下: String str = "长江"; Connection conn = null; //比较preparestatement和statement PreparedStatem
geekfly
2022/05/06
9730
在zabbix中实现发送带有图片的邮件和微信告警
可以手动触发一个报警测试效果,手机上就可以收到带图的报警了,点击消息之后的页面也可以看到历史的图片
没有故事的陈师傅
2019/11/10
2.4K0
GPX数据在mapboxGL中轨迹动画
喜欢跑步的人都会选择一款APP来自己跑步的,常用的有keep、悦跑圈、华为健康等等,每次跑完步,会根据跑步的轨迹绘制轨迹动画。今天咱们讲讲技术,不扯淡,讲一下在mapboxGL中如何实现类似的效果。
牛老师讲GIS
2020/06/08
2K0
GPX数据在mapboxGL中轨迹动画
光栅化[通俗易懂]
定义一个宽高比(Aspect Ratio);还有垂直可视角度 vertical field-of-view (fovY) 。垂直可视角度即从相机原点到上顶中点和下底中点的连线的夹角,可视角度大可以类比成广角相机,它张得就比较开,适合拍近距离的物体;可视角度小,透视投影就越不明显,越像正交投影,就很容易能拍到远处的物体。水平可视角度可以类比。
全栈程序员站长
2022/09/06
1.2K0
光栅化[通俗易懂]
带有CSS3的动画3D条形图
关于如何使用CSS创建动画三维条形图的教程。 这一切都是从一个小实验开始的,这个实验受到了来自Nettuts +的教程的启发,它展示了如何使用CSS,图像和JavaScript将3D条形图嵌入到HTML页面中。在阅读完教程之后,我挑战自己将这个想法变成纯粹的CSS,看看我能做多少。最初的挑战是创造一个经典的半透明的6方框3D盒子。最后的挑战是创建一个完整的三维条形图,我们将在本教程中创建。 你可以看看我以前做过这里。 请注意:本教程的结果只能在支持相应CSS属性的浏览器中按预期方式工作。 我们写下一些关
企鹅号小编
2018/01/15
8800
带有CSS3的动画3D条形图
在vscode中配置R的开发环境
有时候各位使用R的用户不知道会不会有这样的感觉,visual studio和Rstudio由于负载过重,在打开或者加载R script时会出现加载过慢的情况,但对于很多数据工作者来说,variable inspector和data view这类的数据可视化功能必不可少,而visual studio和Rstudio在这方面做得可以说是非常完善。在这时候笔者就想到了visual studio code,毕竟作为宇宙最强IDE的减配和开源版本(这里形容可能不太准确),各种语言相应的开发插件众多。更加让笔者惊喜的是,目前vscode-R一直处于开发阶段,并且在最近的1.2.0版本结合了vscode关于web view的API,添加了R session watcher——一个集成的数据可视化构架,并且在1.21中完善了windows系统下的extension的bug。我们来看看集成的viewer会有什么样的效果:
用户7652506
2020/08/12
11.8K0
在vscode中配置R的开发环境
光栅化 (Rasterization)
上一篇文章讨论了如何在多边形的某一点上分配光强度值,这里主要讨论如何为多边形确定实际的像素,即在栅格屏幕上的对应位置,这个过程称为光栅化(Rasterization)或者扫描转换 (Scan conversion)。
全栈程序员站长
2022/09/20
6800
通过在线平面图网站设计漂亮的平面图
平面图,又称图则,是建筑物工程图的组成部分。当测区面积不大,半径小于10公里(甚至25公里)时,可以用水平面代替水准面。在这个前提下,可以把测区内的地面景物沿铅垂线方向投影到平面上,按规定的符号和比例缩小而构成相似图形,即为平面图。平面图以比例图绘制,表现该建筑物内的客厅、房间、空间及其它硬件的分布,其中包括主力墙、出入口、窗的位置图。
用户5442762
2019/06/10
12K0
使用带有MySQL Router的Replica Set
您可以使用MySQL Router 8.0.19和更高版本对replica set进行引导,就像可以引导InnoDB cluster一样,将MySQL路由器与InnoDB Cluster结合使用”。生成的MySQL路由器配置文件的唯一区别是添加了cluster_type选项。将MySQL路由器引导到副本集时,生成的配置文件包括:
卖菜小弟
2020/01/22
2K0
Python在tkinter界面中显示matplotlib动画
在tkinter应用程序界面中同时显示matplotlib绘制的动态折线图、动态散点图和动态柱状图。
Python小屋屋主
2020/02/23
5K0
点击加载更多

相似问题

平面图动画R中的图像标签

10

将坐标更改为R中具有多层的一系列光栅

11

光栅R

13

在R中输出光栅层

11

如何使用r中的光栅包在光栅中显示所有列名

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文