На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS

Дорогие друзья! Поздравляем вас с Новым 2018 годом!

Всем удачи, успеха и благополучия!
В новом году ожидаем новых рекордов при подсчёте количества ёлочек на экране ;)


msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Обход TreeView
    Делаю обход всех узлов TTreeView.
    Обнаружил такую вещь, что получить корневые узлы, как дочерние, нельзя. Т.е. сначала нужно взять TopItem, а затем (если он не nil, разумеется) выполнять GetNextSibling, пока не получим nil.
    Т.е. даже Count узнать нельзя! Ну что за... :wall: ?!
    Неужели нет способа перечислить их как дочерние через for i := 0 to Node.Count-1 do Recurse(Node[i]); ???
    user posted image Чат форума в Telegramuser posted image Чат форума в Discord (жми и подключайся!) ;)
      Цитата Jin X @
      Т.е. даже Count узнать нельзя! Ну что за... :wall: ?!

      Это не стена, а дерево, причем виндовое. У него есть единственный хранимый TTreeView.Count - общее кол-во узлов\элементов в дереве. А TTreeNode.Count - это дельфийская примочка для пионЭров\формошлёпов, которые обожают цикл for и избегают while\repeat. Для них дядя Борланд специально написал простенькую функцию TTreeNode.GetCount, которая через GetFirst\NextChild "бы-ыстренько" подсчитывает кол-во дочерних элементов узла, и еще более тупую функцию property Item[i] = GetItem(i), которая также через GetFirst\NextChild находит дочерний элемент по заданному индексу.
      Вот и подумай - "Оно тебе надА"? Вместо одного собственного цикла while запускать Count+1 аналогичных циклов, упрятанных под капотом свойств Count и Item[i] ?!
      Сообщение отредактировано: leo -
        Под капот не заглядывал, но в целом ясно :)
        user posted image Чат форума в Telegramuser posted image Чат форума в Discord (жми и подключайся!) ;)
          Цитата Jin X @
          Делаю обход всех узлов TTreeView.
          Обнаружил такую вещь, что получить корневые узлы, как дочерние, нельзя.

          Для обхода всех узлов есть универсальные методы GetNext и GetNextVisible, которые выдают следующий по порядку узел независимо от его уровня. (Если нужен учет уровня, то это можно сделать внутри процедуры обработки по if или case Level).

          В принципе для последовательного обхода всех узлов дерева можно использовать и св-во TTreeView.Items[i] в цикле for. Хотя в справке и говорится, что это м.б. time-intensive, но на самом деле это относится только к непоследовательному доступу, т.к. в коллекции TTreeNodes используется элементарное кэширование\запоминание последнего индекса и соотв-го ему узла, поэтому при изменении индекса на +-1 используются те же GetNext или GetPrev относительно предыдущего узла. В общем же случае приходится крутить цикл поиска элемента по индексу через GetNext аналогично св-ву TTreeNode.Item[i]. Отсюда и can be time-intensive.
            leo, да, мне с учётом уровня и надо было как раз.
            Ну а если брать родителя через GetNextSibling, а предков через Items (рекурсивно), в принципе, тоже последовательно должно быть. Тогда тоже не должно быть time-intensive, получается?
            Хотя, конечно, через GetNext с проверкой Level проще. Не знал просто раньше, что есть Level. Так-то, действительно, проще получается...
            user posted image Чат форума в Telegramuser posted image Чат форума в Discord (жми и подключайся!) ;)
              Ну и если немножко побурчать: обходить надо не TreeView, а ту модель данных, на основании которой TreeView заполняется. Не будет никаких шараханий по WinAPI, можно делать это из другого потока - в общем, сплошные плюсы :good:
              Windows as usual - my "wau" Windows experience
                Цитата Mr.Delphist @
                Ну и если немножко побурчать: обходить надо не TreeView, а ту модель данных, на основании которой TreeView заполняется.
                Ты имеешь в виду другое "хранилище" данных (древовидный список вне TTreeView). Это понятно, но и к TTreeView эти данные нужно же привязать тоже. Да, можно привязать, например, к Data, но тогда поиск TTreeNode с нужным Data будет тоже долгим...
                user posted image Чат форума в Telegramuser posted image Чат форума в Discord (жми и подключайся!) ;)
                  Я про подход в стиле MVVM, MVC и т.п. Когда TreeView - не более чем отображалка, её можно убрать или изменить, но код обработки данных от этого НЕ изменится.
                  Windows as usual - my "wau" Windows experience
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script Execution time: 0,1116 ]   [ 18 queries used ]   [ Generated: 22.01.18, 16:17 GMT ]