Здравствуйте, в этой статье хотел бы рассказать как можно отобразить картинки в дереве рядом с узлами. Наверняка многие делали все возможные каталоги или применяли «деревья» в своих приложениях, где необходимо было именно размещать картинки, а например при раскрытии родительских узлов, чтобы картинка менялась, например, на раскрытую папку, или при выделении какого-то узла. Вот об этом мы сегодня и поговорим. Для начала мы будем использовать все тот же проект, что у нас и был по VirtualStringTree. Что нам понадобится для нашей статьи, да практические и ничего — это
- TImageList — вкладка Win32
Собственно в TImageList мы и будем хранить наши картинки, которые по какому-нибудь событию будем изменять, в данном случае я буду использовать всего 2 вида картинок — это
- папка
- открытая папка
То есть по открытию узла картинка будет меняться на отрытую папку, а также при выделении узла.
Давайте в наш TImageList добавим картинки. У TVirtualStringTree есть замечательное событие
- GetImageIndex
А также
- GetImageIndexEx
Последнее почти ничем не отличается от первого, так что будем использовать второе событие. В данном событии есть переменные
- ImageIndex: Integer
- ImageList: TCustomImageList
Первая переменная отвечает за индекс картинки, которую мы хотим отобразить, а вторая переменная отвечает за то, откуда мы будем брать те самые картинки для отображения. Поэтому давайте на это событие напишем следующий код
procedure TForm1.VirtualStringTree1GetImageIndexEx(Sender: TBaseVirtualTree;
Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
var Ghosted: Boolean; var ImageIndex: Integer;
var ImageList: TCustomImageList);
begin
ImageList:=ImageList1;
ImageIndex:=0;
end;
Если скомпилируем проект, то картинки не отобразятся, Вы скажите почему, да потому, что нам необходимо еще связать свойство TVirtualStringTree - Images с TImagelist, после этого у нас все узлы будут с картинками, но с одинаковыми картинками, а нам необходимо, чтобы при выделении они менялись и при открытии узлов. Давайте тогда в данном свойстве допишем следующее
procedure TForm1.VirtualStringTree1GetImageIndexEx(Sender: TBaseVirtualTree;
Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
var Ghosted: Boolean; var ImageIndex: Integer;
var ImageList: TCustomImageList);
begin
ImageList:=ImageList1;
ImageIndex:=1;
if (Sender.Expanded[Node]) or (Sender.FocusedNode=Node)then
begin
ImageIndex:=0;
end;
end;
Давайте немного разберем, Expanded отвечает за то открыт ли узел или нет, у него даже похожее свойство есть и когда я столкнулся с такой проблемой как менять картинки в узлах, то я сперва стал прописывать в данном событии там переменным присваивал значения, затем в событии получения картинок я эти переменные сверял, в итоге картинки менялись, но у всех сразу, в итоге я пришел к данному решению, что насчет выделения, то мы просто сравниваем равно ли выделении текущему узлу, если да, то также меняем просто индекс картинки и все. Очень просто