Delphi TImagelist未添加位图

Delphi TImagelist未添加位图,delphi,graphics,timagelist,Delphi,Graphics,Timagelist,我已经穷途末路了。。。正在尝试获取自定义图片列表、TImageList和TListView以协同工作。原始问题:列表中未显示动态添加的图片。缩小范围,问题在时间列表中。代码如下。ilMain是TImagelist(在别处定义)。将位图添加到列表中,立即检索,第一次“绘制”效果良好,但sedond失败。。。我错过了什么 var i:integer; test:TSch; currentimage :TBitmap; stupid :TBitmap; begin currentIm

我已经穷途末路了。。。正在尝试获取自定义图片列表、TImageList和TListView以协同工作。原始问题:列表中未显示动态添加的图片。缩小范围,问题在时间列表中。代码如下。ilMain是TImagelist(在别处定义)。将位图添加到列表中,立即检索,第一次“绘制”效果良好,但sedond失败。。。我错过了什么

var i:integer;
  test:TSch;
  currentimage :TBitmap;
  stupid :TBitmap;

begin
  currentImage:=TBitmap.Create;
  stupid:=TBitmap.Create;
  ilMain.Clear;
//  currentImage.LoadFromFile('C:\Delphi\piccat\pics\MonaLisa.jpg');
  JPeg2Bmp('C:\Delphi\piccat\pics\MonaLisa.jpg',currentImage);

  form1.canvas.Draw(100,10,currentimage);
  ilMain.Add(currentimage,nil);
  ilMain.GetBitmap(0,stupid);
  form1.canvas.Draw(200,10,stupid);
编辑:

对这个做了一些进一步的测试;结果非常混乱和不一致

结果实际上很大程度上取决于输入文件的大小(感谢那个指针,kobik!);似乎所有小于256x256的图片都没有导入到imagelist中,而沿X轴的较大图片(有时??)分布在多个项目上

ilMain设置为256x256像素

以下是几种输入尺寸(X X Y,以像素为单位)的输出: 950x414 第一次绘制显示整个图像,第二次在左上角拍摄256x256像素。但是,TImagelist的三个项目被填充为3x 256x256像素:这三个图片可以从主图片中“剪切”,但仍然是256x256像素。所有垂直或水平尺寸小于256x256的切割边缘都将丢失

1600x1600 导入六幅图像;第一排完整的256x256块,可从图片顶部切割。tp右侧的不完整块被省略,Y-size 256以下的所有行也被省略

1500x1000 与前一个类似;现在进口了五件物品

638x376 再次相似;现在只有两个项目“适合”

197x256(我的原始测试文件,在上面的帖子中描述) 未导入任何项目(X尺寸是否小于TImaglist X尺寸?)

256x256 同样,没有导入任何数据

257x257 仍然没有导入数据

260x260 仍然没有导入数据

300x300 仍然没有导入数据

512x256 非常奇怪的一个。一张图片是进口的;但是它的尺寸减小了,所以大约70%的原始图片适合(新的)256 X尺寸。图片下方添加了一个黑条,以弥补因缩小而丢失的空间

所以这就是我现在停止测试的地方,我想知道是否有人可以在这里透露一些信息

编辑:设计部分移至新问题(请参见注释kobik中的请求,谢谢!)

假设您的
JPeg2Bmp
正确,您的代码可以工作(或至少需要工作)。我想@Dima的第二个评论是正确的

您尚未显示
ilMain
属性,如果使用默认值,则会得到一个宽度/高度为16的图像列表

尝试省略对
form1.canvas.Draw(100,10,currentimage)的第一次调用
,并仅绘制
form1.canvas.draw(200,10,愚蠢)并且您应该在位置200,10处看到
16x16
图纸

TImagelist
无法加载任意大小的图像
您需要预先定义它的大小,并加载具有适当大小的位图。i、 e.创建缩略图以适应imagelist尺寸

还请注意(您可能知道),您只需要在响应
WM_PAINT
消息时进行绘制。e、 g.以
OnPaint
事件的形式

编辑:关于您的编辑,这就是
TImageList
的工作原理。如果添加的位图大于imagelist宽度,它将尝试将位图拆分为单独的位图以适合imagelist大小。这是故意的

请参阅有关
hbmImage
参数的文档:

包含一个或多个图像的位图句柄。号码 从位图的宽度推断图像的宽度


我看你的代码没有任何问题。也许,问题在于添加位图的索引。只能为零索引检索位图。因此,您总是首先添加位图,而其他位图仍然放在
TImageList
中。尝试将以下内容替换为:
ilMain.GetBitmap(0,愚蠢)`
ilMain.GetBitmap(ilMain.Add(currentimage,nil),愚蠢)`。只是一个建议……或者只是另外一个想法:
currentimage
位图的大小很大(超过200x200像素),所以“第二次绘制”是在已经绘制的
currentimage
上执行的,因此您不会注意到第二个图像“隐藏”在
currentimage
上。后退一步,深呼吸,放松。做一个决定。使代码尽可能清晰。贴出来。迪玛,不,照片会显示出来。显然,这是测试代码,所以是的,索引是硬编码的,一旦我让它工作,显然会使它成为动态的。。。顺便说一句,您建议的更改会得到相同的结果。代码不完整。请参阅上面我的测试数据。。。如果我把一张256x256的图片添加到一张256x256的图片列表中,那应该可以了,对吧?@Jur,是的。对我来说确实如此。导入比TImageList的X-Y更小的文件有什么问题吗?我的意思是,例如,将64x64导入256x256图像列表?当你把其他属性(除了宽度/高度)放到表单上时,你会调整它们的默认值吗?@jur-a的位置是问题,而不是答案。你需要知道你到底在做什么,这样你的问题才能被发现。