我使用最后一个TPngComponents“PngComponents for Delphi 2009 - Delphi 10.2 Tokyo”。 创建简单的project来显示我的问题。
为什么在第二次分配TPngImageCollectionItem对象后,TreeView仍然会绘制第一个分配的图像,可能需要调用一些刷新函数?
type
TForm1 = class(TForm)
pilTree: TPngImageList;
pilNoImage: TPngImageList;
pilAllCor: TPngImageList;
tvCor: TTreeView;
pilAllNotCor: TPngImageList;
tvNoCor: TTreeView;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
procedure AddNodes(ATV: TTreeView);
var
nFirst, nChild: TTreeNode;
begin
nFirst := ATV.Items.AddChild(nil, '1');
nChild := ATV.Items.AddChild(nFirst,'2');
nChild.ImageIndex := 1;
nChild.SelectedIndex := 1;
nFirst.Expanded := True;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
iI: Integer;
ItemAdd: TPngImageCollectionItem;
ANode: TTreeNode;
begin
// Steps working correct
for iI := 0 to 1 do begin
ItemAdd := pilAllCor.PngImages.Add;
ItemAdd.Assign(pilTree.PngImages[iI]);
end;
// Steps working NOT correct
for iI := 0 to 1 do begin
ItemAdd := pilAllNotCor.PngImages.Add;
ItemAdd.Assign(pilNoImage.PngImages[0]);
ItemAdd.Assign(pilTree.PngImages[iI]);
end;
//Setup treeview
tvCor.Images := pilAllCor;
tvNoCor.Images := pilAllNotCor;
AddNodes(tvCor);
AddNodes(tvNoCor);
end;
示例:
答案 0 :(得分:4)
将 TPngImage 添加到 TPngImageList 的方法是使用 AddPng 而不是摆弄该集合。这还将更新负责实际显示图像的基础Windows图像列表。
正确的代码应如下所示:
for iI := 0 to 1 do begin
pilAllCor.AddPng(pilTree.PngImages[iI].PngImage);
end;
如果要更改现有项目,则应指定集合项目的 PngImage 属性:
pilAllCor.PngImages[iI].PngImage := pilTree.PngImages[iI].PngImage;