我使用最后一个TPngComponents "PngComponents for Delphi 2009 -Delphi10.2东京“。创建简单的项目来显示我的问题。
为什么在第二次分配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;示例:

发布于 2017-11-01 14:11:00
将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;https://stackoverflow.com/questions/47050299
复制相似问题