Здравствуйте, в этой статье хотел бы рассказать как можно отобразить картинки в дереве рядом с узлами. Наверняка многие делали все возможные каталоги или применяли «деревья» в своих приложениях, где необходимо было именно размещать картинки, а например при раскрытии родительских узлов, чтобы картинка менялась, например, на раскрытую папку, или при выделении какого-то узла. Вот об этом мы сегодня и поговорим. Для начала мы будем использовать все тот же проект, что у нас и был по 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 отвечает за то открыт ли узел или нет, у него даже похожее свойство есть и когда я столкнулся с такой проблемой как менять картинки в узлах, то я сперва стал прописывать в данном событии там переменным присваивал значения, затем в событии получения картинок я эти переменные сверял, в итоге картинки менялись, но у всех сразу, в итоге я пришел к данному решению, что насчет выделения, то мы просто сравниваем равно ли выделении текущему узлу, если да, то также меняем просто индекс картинки и все. Очень просто

А знаете ли Вы, что в настоящее время очень популярны бойлеры. Бойлер — это водонагреватель, вода нагревается очень быстро, что удобно. Кроме всего этого Вы сможете Выбрать бойлер в интернет магазине, тем самым покупка становиться еще более удобной и быстрой.

Полный исходник статьи качаем тут

Автор статьи - Andrey53 

Метки: , , ,

Оставить комментарий

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*