第二次分配TPngImageCollectionItem对象后TreeView仍然绘制第一个分配的图像(Delphi XE 7)

时间:2017-11-01 07:43:08

标签: delphi treeview tpngimagelist

我使用最后一个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;

示例:

enter image description here

1 个答案:

答案 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;