После второго назначения объекта TPngImageCollectionItem TreeView по-прежнему рисует первое назначенное изображение (Delphi XE 7)

Я использую последние TPngComponents " PngComponents для Delphi 2009 - Delphi 10.2 Tokyo". Создать простой проект, чтобы показать мою проблему.

Почему после второго назначения 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;

Пример:

1 ответ

Решение

Чтобы добавить 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;
Другие вопросы по тегам