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