Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/1: Рейтинг темы: голосов - 1, средняя оценка - 5.00
 Аватар для DoNVen
18 / 15 / 3
Регистрация: 30.10.2024
Сообщений: 92

Из VirtualTreeview делаем ListView

27.02.2025, 09:51. Показов 2809. Ответов 18

Студворк — интернет-сервис помощи студентам
Пытаюсь из VirtualTreeview сделать аналог ListView.
Помогите разобраться с некоторыми затруднениями:
  1. При включении свойства toHotTrack по умолчанию текст ноды над которой находится курсор становится подчеркнутым. Требуется, чтобы выделение ноды учитывало тему системного оформления по аналогии с свойством coAllowClick для заголовка Header. Пробовал настройки из Colors, но добился только изменение цвета текста ноды при наведении курсора на нее.
  2. Требуется, чтобы при сортировке иконки, подгружаемые к ноде, так же как и текст изменяли свою позицию, а не оставались на своих местах.
  3. Как реализовать поиск по инкременту. Использую материалы статьи https://github.com/AlekseyRykov2018/vt-info, но пока результата не добился.
  4. Как реализовать выполнение каких либо действий при клике на иконку ноды в произвольном столбце. Подобное обсуждалось для ListView Действия при нажатии на иконку в ListView. "Топорный" вариант я реализовал. Для этого в колонке размещаю только иконку без текста, а ширину колонки делаю по размеру иконки. Пришлось отказаться от текста в заголовке колонки.
virtTreeView.zip

Прикладываю тестовую программу.
При клике на:
Button1 добавление нод в VirtualTreeview ;
Button2 очистка VirtualTreeview;
Button3 автовыравнивание ширины колонок;
Button4 вывод значения текста ноды из 0 колонки
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.02.2025, 09:51
Ответы с готовыми решениями:

VirtualTreeView
В моей программе для сохранения и обработки данных (строк) используется 8 списков строк. Каждый список строк отображается в отдельном...

VirtualTreeView
Изучаю возможности VirtualTreeView, сделал простенький список из двух колонок и пытаюсь сделать чтобы узлы в первой колонке просто...

VirtualTreeView. Чекбоксы
Такая проблема. Компонент Virtual TreeView. Создано дерево с двумя уровнями. У каждого нода чекбокс. При клике на чекбоксе корневого нода,...

18
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33416 / 21524 / 8238
Регистрация: 22.10.2011
Сообщений: 36,931
Записей в блоге: 12
27.02.2025, 10:24
Лучший ответ Сообщение было отмечено DoNVen как решение

Решение

Цитата Сообщение от DoNVen Посмотреть сообщение
Требуется, чтобы выделение ноды учитывало тему системного оформления
Для этого, насколько я помню, надо написать свой обработчик OnBeforeCellPaint, например вот так:
Pascal
1
2
3
4
5
6
7
8
9
10
procedure TForm1.VSTBeforeCellPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
begin
  if (CellPaintMode = cpmPaint) and (Node = VST.HotNode) then
  begin
    TargetCanvas.Brush.Color := clHighlight;
    TargetCanvas.FillRect(CellRect);
  end;
end;
1
Valechka-Думай о Высоком
 Аватар для Ludwig Valentin
171 / 290 / 26
Регистрация: 11.08.2022
Сообщений: 3,713
27.02.2025, 11:59
Дерево в список переведёшь только с потерей узлов и утратой иерархии.
0
 Аватар для DoNVen
18 / 15 / 3
Регистрация: 30.10.2024
Сообщений: 92
27.02.2025, 12:15  [ТС]
Цитата Сообщение от Ludwig Valentin Посмотреть сообщение
Дерево в список переведёшь только с потерей узлов и утратой иерархии.
Я так понимаю тут никакой иерархии нет. Смысл в том, что в программе я получаю список программ(уже отсортированный по алфавиту) и мне надо его отобразить как делает это ListView, с возможностью сортировки по колонкам и т.д. Каждое значение из списка это отдельная нода. Вопрос для чего мне это? Во первых изучить VirtualTreeview. Во вторых у меня в ListView на QT очень неприятный баг с сортировкой
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33416 / 21524 / 8238
Регистрация: 22.10.2011
Сообщений: 36,931
Записей в блоге: 12
27.02.2025, 12:21
Лучший ответ Сообщение было отмечено DoNVen как решение

Решение

Цитата Сообщение от DoNVen Посмотреть сообщение
Требуется, чтобы при сортировке иконки, подгружаемые к ноде, так же как и текст изменяли свою позицию, а не оставались на своих местах.
Чуть-чуть исправляем OnGetImageIndexEx:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
procedure TForm1.VSTGetImageIndexEx(Sender : TBaseVirtualTree;
  Node : PVirtualNode; Kind : TVTImageKind; Column : TColumnIndex;
  var Ghosted : Boolean; var ImageIndex : Integer;
  var ImageList : TCustomImageList);
var
  Num : Integer;
  Data : PDate;
begin
  ImageIndex := -1;
  Data := VST.GetNodeData(Node);
  Num := Data^.ID; // Именно это нам нужно
  // Num := Node^.Index;
  if Kind in [ikNormal , ikSelected] then // либо выбран, либо нет
    begin
      if Column = 0 then                    // если 1-й столбец
        begin
          ImageList := ImageList_icons;
          ImageIndex := Num;                    // 1-е изображение ImageList1'а
        end;
 
      if Column = 3 then                    // если 2-й столбец
        begin
          ImageList := ImageList_Link;
          ImageIndex := 0;                    // 2-е изображение ImageList1'а
        end;
    end;
  {Sender.NodeHeight[node] := 40; //Если изображение большое}
end;
, и все нормально меняет позицию.
1
Айлурофил
 Аватар для Massaraksh7
516 / 449 / 112
Регистрация: 27.05.2017
Сообщений: 2,716
Записей в блоге: 5
27.02.2025, 16:56
Цитата Сообщение от DoNVen Посмотреть сообщение
Прикладываю тестовую программу.
Не компилируется
Там какие-то сторонние модули laz.virtualtree, laz.fakeactivex
В зависимостях не нашёл
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33416 / 21524 / 8238
Регистрация: 22.10.2011
Сообщений: 36,931
Записей в блоге: 12
27.02.2025, 17:19
Massaraksh7, под Linux-ами все компилируется современным Лазарусом, под Windows laz.FakeActiveX можно убрать или закомментировать, и все точно так же компилируется (проверено под Win11 + Lazarus 3.8)
0
Айлурофил
 Аватар для Massaraksh7
516 / 449 / 112
Регистрация: 27.05.2017
Сообщений: 2,716
Записей в блоге: 5
27.02.2025, 18:07
Цитата Сообщение от volvo Посмотреть сообщение
под Windows laz.FakeActiveX можно убрать или закомментировать, и все точно так же компилируется
Да, действительно.
---
Конечно, каждый выбирает то, что ему удобно, я лично такие вещи делаю на TStringGrid.
Миниатюры
Из VirtualTreeview делаем ListView  
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33416 / 21524 / 8238
Регистрация: 22.10.2011
Сообщений: 36,931
Записей в блоге: 12
27.02.2025, 18:11
А у меня и в TListView все работает, без описанных ТС-ом глюков (как под gtk2, так и под Qt5), так что я бы даже не стал ничего менять, тем более на такой навороченный компонент. К тому же, ListView очень просто виртуализируется, в отличие от StringGrid-а...
0
Айлурофил
 Аватар для Massaraksh7
516 / 449 / 112
Регистрация: 27.05.2017
Сообщений: 2,716
Записей в блоге: 5
27.02.2025, 18:18
Цитата Сообщение от volvo Посмотреть сообщение
К тому же, ListView очень просто виртуализируется, в отличие от StringGrid-а...
Никогда с ним не работал. Будет время, попробую.
0
 Аватар для DoNVen
18 / 15 / 3
Регистрация: 30.10.2024
Сообщений: 92
27.02.2025, 19:17  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
А у меня и в TListView все работает, без описанных ТС-ом глюков (как под gtk2, так и под Qt5)
А можно мне тестовый примерчик, в котором работает? Я хоть погляжу, у себя запущу
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33416 / 21524 / 8238
Регистрация: 22.10.2011
Сообщений: 36,931
Записей в блоге: 12
27.02.2025, 19:40
Чуть позже, я сейчас за другим компом...
0
 Аватар для DoNVen
18 / 15 / 3
Регистрация: 30.10.2024
Сообщений: 92
27.02.2025, 20:43  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
А у меня и в TListView все работает, без описанных ТС-ом глюков (как под gtk2, так и под Qt5)
Мне сейчас на GitLab ответили, что воспроизвели мой баг и он будет решен. Так что есть надежда у меня
0
Айлурофил
 Аватар для Massaraksh7
516 / 449 / 112
Регистрация: 27.05.2017
Сообщений: 2,716
Записей в блоге: 5
28.02.2025, 00:51
Цитата Сообщение от DoNVen Посмотреть сообщение
Button3 автовыравнивание ширины колонок;
Практика показывает, что это неудобно пользователям, если имеется очень длинный текст. Лучше сделать ширину колонок настраиваемой и запоминаемой, а при наведении курсора на ячейку, в которой не помещается текст, выводилась бы подсказка с полным текстом.
2
 Аватар для DoNVen
18 / 15 / 3
Регистрация: 30.10.2024
Сообщений: 92
28.02.2025, 09:04  [ТС]
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Практика показывает, что это неудобно пользователям, если имеется очень длинный текст. Лучше сделать ширину колонок настраиваемой и запоминаемой, а при наведении курсора на ячейку, в которой не помещается текст, выводилась бы подсказка с полным текстом.
Соглашусь. Когда ширина столбца постоянно меняется в зависимости от ширины текста это не удобно
0
 Аватар для DoNVen
18 / 15 / 3
Регистрация: 30.10.2024
Сообщений: 92
01.03.2025, 08:25  [ТС]
Подытожу.
Если знаешь как пользоваться VirtualTreeView это даже очень неплохая альтернатива ListView. На мой взгляд большим плюсом у VirtualTreeView является не только скорость работы с данными (в прилагаемом мною примере обрабатывается 10000 позиций), но и занимаемый объем оперативной памяти. Я заметил, что при обработке 4000 позиций в ListView, примерно каждая вторая сортировка увеличивает использование оперативки на 9Мб. Таким образом я догонял потребление память до 300Мб, пока не надоедало.
В VirtualTreeView из примера на qt5 потребление 45Мб и оно не увеличивается. Это важно на слабых машинах.
Выкладываю здесь свою тестовую программу для примера.
Реализовано:
  1. Добавление элементов в VirtualTreeView
  2. Добавление иконок в разные колонки
  3. Очистка VirtualTreeView
  4. Автоподгон ширины колонок при загрузке элементов
  5. Автободгон ширины колонок по нажатию на пункт меню при правом клике мышки
  6. Сортировка элементов по тексту и числам
  7. Внешний вид приведен к виду ListView. Используется тема оформления системы
  8. Реализовано действие при нажатии на иконку ссылки. Также реализована индикация наведения на иконку ссылки(тут есть над чем поработать)
  9. Реализован вывод имени выделенного элемента при нажатии на кнопку
Благодарю всех принимавших участие.

virtTreeView.zip

Кликните здесь для просмотра всего текста
Скриншот
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33416 / 21524 / 8238
Регистрация: 22.10.2011
Сообщений: 36,931
Записей в блоге: 12
01.03.2025, 11:42
Цитата Сообщение от DoNVen Посмотреть сообщение
Я заметил, что при обработке 4000 позиций в ListView, примерно каждая вторая сортировка увеличивает использование оперативки на 9Мб
Вот это не воспроизводится. Сделал список из 10000 наименований, с иконками. Память при сортировках стоит как вкопанная, как было в начале 37 MiB, так и осталось (проверял и htop-ом, и TaskManager-ом из Xfce). Опять qt-widgetset чудит?
1
 Аватар для DoNVen
18 / 15 / 3
Регистрация: 30.10.2024
Сообщений: 92
01.03.2025, 11:58  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Опять qt-widgetset чудит?
Так и есть. На видео видно. simplescreenrecorder-2025-03-01_11.53.04.mp4
Для GTK2 память как вкопаная. Видео не прикладываю.

Сейчас пишу баг для Qt по вопросу клика по SubItemImages. Я писал, что у меня не работает, а на новом проекте заработало. Не работает на Qt когда Checkboxes=True. Точнее работает некорректно. Там координаты TRect неправильно выдает. В мое проекте как раз Checkboxes=True.

Так глядишь ListView на Qt отладим

Надо бы мое сообщение подправить, там где я про 4000 элементов написал. Раз это баг.
0
 Аватар для DoNVen
18 / 15 / 3
Регистрация: 30.10.2024
Сообщений: 92
01.03.2025, 21:07  [ТС]
Цитата Сообщение от DoNVen Посмотреть сообщение
Так и есть. На видео видно. simplescreenrecorder-2025-03-01_11.53.04.mp4
Потребление памяти исправлено. Конечно ни как в GTK2, но приемлемо. Сказали на qt полностью это не вылечишь. Изменения в 4.0 fixes пошли.
Так же исправили клик по SubItemImages для qt из темы Действия при нажатии на иконку в ListView
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.03.2025, 21:07
Помогаю со студенческими работами здесь

VirtualTreeView + FreeNode
Работаю с компонентом VirtualTreeView. Часто создаются и удаляются ноды, через 2 часа работы программа занимает в памяти около 300...

VirtualTreeView доработка
Здравствуйте, хочу сделать компонент на основе VirtualTreeView. Конкретнее в классе TVirtualTreeColumn добавить несколько своих property....

VirtualTreeView + сканер Штрихкодов
Здравствуйте. Использую Delphi XE 2 и VirtualTreeView. При использовании сканера штрихкода honeywell 1250g + VirtualTreeView фокус с...

VirtualTreeView работа с узлами
Использую VirtualStringTree. Вопросы: 1. Как получить номер(индекс,расположение) элемента дерева, по которому был совершен клик? 2....

Текст ноды в VirtualTreeView
Здравствуйте, вопрос в том, можно ли в этом компоненте добраться до текста ноды, вроде того как было в TTreeview? Что то вроде того: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru