Отображение картинок в TVirtualStringTree рядом с узлами

3 минуты на чтение

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

Facebook Vk Ok LinkedIn Telegram

Похожие записи:

Сейчас расскажу как я добавляю узлы в TVirtualStringTree. То есть попробуем добавить узлы, затем первыми в родительском, последним в родительском. То есть здесь в данном компоненте TVirtualStringTree есть небольшой нюанс, тут не получится как TTreeView сразу д...
Приветствую всех читателей блога. Совсем недавно делал мини-программу по получению информации из фтп-сервера, то есть. Другими словами простенький фтп-клиент. Я не буду здесь рассказывать, как сделать полноценный фтп-клиент, я расскажу, как использовать компон...
Здравствуйте, в этой статье я хотел бы рассказать как можно сохранить узлы в Stream. Данную переменную можно хранить где угодно, в файле, БД. Мы остановимся на БД, так как чаще всего для отображения узлов используют именно БД, а там мы и будем хранить Stream, ...