|
|
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
Сразу прошу не пинать, не программист. Так же уверен что в "гугле" на это уже сто раз давался ответ (да даже тут 900 тем находит по запросу treeview). Но как-то мозг кипит от чтения не того, что нужно. Вопрос простой - как удобнее всего можно однозначно определять узел в Treeview, как при выделении пользователем, так и для выставлении курсором (или родителем). Есть ли способ обращаться к узлу (например для добавления "листов") по индексам (как к массиву), ну например (21,4,100500) - где 21 индекс первого уровня, 4 - второго уровня у родителя "21", ну а 100500 - третьего у родителя "4". И обратно - вывести информацию об выделенном пользователем узле в указанном выше виде (можно и руками самому написать, но может что уже есть). Насколько я понимаю TreeView1.Items ведет учет узлов просто по порядку без учета уровня и прочего, то есть для корректного обращения надо постоянно вести учет всех предыдущих узлов, что при динамическом создании всяких веток и листов как-то неудобно и выглядит костылем. Ну и может подскажите по общей задаче. Делают такое классическое меню настроек как в большинстве программ, где щелкая по дереву настроек выпадают нужные настройки для редактирования, но(!), файл настроек представляет из себя несколько больших текстовых файлов, разбитых на разделы, которые ещё и постоянно редактируются в плане количества и вида настроек, потому все нужные элементы создаю динамически подгружая из файлов (при том элементы потом будут разные, и чекбоксы всякие, и даже картинки разные), потому сколько элементов в каждом узле и глубину я не знаю. Картинки чисто для примера, не обращайте внимание на содержание, только на формат ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 15:44 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
Естественно через TreeView1.Items и пересчет узлов могу всё реализовать, но есть чувство, что это не правильно и есть более грамотные способы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 15:46 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
У узла есть свойство Data. Там можно хранить указатели на свои данные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 15:54 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_У узла есть свойство Data. Там можно хранить указатели на свои данные Хм. Спасибо. Изучу. Вроде и видел, но как-то не подумал. Через Data можно задавать Node, или всё таки надо будет поиск по всем Data производить? Ещё раз спасибо, пошел искать информацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 16:06 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
лучше расскажите что за задача зачем вам бежать по всем Node ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 16:09 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичЧерез Data можно задавать Node Если нужен серфинг по "детям", то у каждого узла Items[i] = TTreeNоde, есть еще свойства HasChildren, Item и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 16:09 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичЧерез Data можно задавать Node, или всё таки надо будет поиск по всем Data производить?Не понял вопроса. Какая у вас задача? По узлу сопоставить ему некоторые данные? Или найти узел по каким-то признакам? Андрей Игоревичну например (21,4,100500) - где 21 индекс первого уровня, 4 - второго уровня у родителя "21", ну а 100500 - третьего у родителя "4". Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 16:12 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичЧерез Data можно задавать Node, или всё таки надо будет поиск по всем Data производить?В Data можно хранить хоть чёрта лысого. Тут главное обеспечить наличие и соответствие типа этого лысого чёрта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 16:14 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
krapotkinлучше расскажите что за задача зачем вам бежать по всем Node ? Ну я больше не "бежать по всем" имел в виду, а обратиться к любому нужному в любой момент напрямую. wadmanАндрей ИгоревичЧерез Data можно задавать Node Если нужен серфинг по "детям", то у каждого узла Items[i] = TTreeNоde, есть еще свойства HasChildren, Item и т.д. Спасибо, изучу. _Vasilisk_Андрей ИгоревичЧерез Data можно задавать Node, или всё таки надо будет поиск по всем Data производить?Не понял вопроса. Какая у вас задача? По узлу сопоставить ему некоторые данные? Или найти узел по каким-то признакам? Сначала динамически создать дерево в зависимости от неких исходных данных, далее при выделении каждого узла выполнять определенные действия (уничтожать/рисовать на скролбоксе всякие элементы настроек, картинки и прочее), так же необходимо в любой момент выделить нужный узел/лист программно с выполнением привязанных к нему действий. Ну и там прочее по мелочи. удобнее всего это делать связав индексы узлов и нужных мне действий (ну так проще не запутаться когда дерево станет весьма большим) _Vasilisk_ Код: pascal 1. Отлично, практически то, что я и хотел, единственно, как я понимаю, таким образом я могу обращаться только к элементам одного уровня (в зависимости от количества скобок). Попытка подставить "-1" и "nil", увы, не помогла. GatorАндрей ИгоревичЧерез Data можно задавать Node, или всё таки надо будет поиск по всем Data производить?В Data можно хранить хоть чёрта лысого. Тут главное обеспечить наличие и соответствие типа этого лысого чёрта. А запись с кучей многомерных динамических массивов на пол гигабайта съест? Или таким лучше всё таки не заниматься :)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 18:18 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревичтаким образом я могу обращаться только к элементам одного уровня (в зависимости от количества скобок). Попытка подставить "-1" и "nil", увы, не помогла.Наоборот, это обращение к элементам трех разных уровней Андрей Игоревичдалее при выделении каждого узла выполнять определенные действияЗаносите идентификатор действий в Data. Обращаетесь к ней при выделении узла из события TreeView.OnChange Андрей Игоревичтак же необходимо в любой момент выделить нужный узел/лист программно с выполнением привязанных к нему действий. Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 18:38 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичА запись с кучей многомерных динамических массивов на пол гигабайта съест? Или таким лучше всё таки не заниматься :)?В Data сидит указать, узлу начхать, на что он указывает. Кроме того, там можно хранить битовую маску. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 19:07 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
автор, посмотри в сторону VirtualTreeView компонент другой (бесплатный), но более гибкий и мощнее, с кучей примеров... возможно он больше подойдёт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 19:50 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, не знаю, то ли вы ищете. TCustomTreeView.Selected - указывает на выделенный узел. TTreeNode.Index - индекс (номер) данного узла в списке детей его родителя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 20:18 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
Сдается мне, что автор придумал кривое решение задачи и мы должны помочь с реализацией вместо того, чтобы узнать саму задачу первым делом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 22:15 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, AbsoluteIndex ? http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/ComCtrls_TTreeNode_AbsoluteIndex.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 23:28 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
Более менее вник в то, что мне написали и понял, что все примерно одно и тоже и предлагают :), но в большинстве не совсем то, что я спрашивал (ну отчасти). Про TreeView.Selected.Index, TreeView.Selected.AbsoluteIndex, TreeView1.OnChange и прочее подобно я естественно освоил сразу ибо есть во всяких нубомануалах в интернете. Задам вопрос иначе с примером понагляднее (сформирован рандомно). Задача 1: Как наиболее простым способом программно (не выделением пользователем) одной общей процедурой на все, ну например, добавить несколько "узлов" в "Ещё какие-нибудь параметры 4 2 0", а потом добавить ещё несколько в "Глобальные параметры 4", а потом ещё куда-нибудь. Ну суть, думаю, ясна. Через Код: pascal 1. не понятно как выбрать узел второго уровня (1го если от 0) и так же не понятно как он работает с нулевым уровнем, так как, например Код: pascal 1. выделит не "Глобальные параметры 5", а "Локальные параметры 0 1" (ну по абсолютному индексу). Можно обыграть условиями, но тоже как-то не очень. Задача 2 (в принципе эта задача решается через Data, но вдруг ещё чего подскажите): Как при выделении пользователем любого узла получить привязанные к нему параметры однозначно и удобно его определяющие, наиболее удобно - индексы как те что после текста. Тут всё можно полностью через Data реализовать, думаю можно даже сами данные тогда в Data сохранять, а не в отдельных масивах, так что особо можно не мусолить, хотя если есть иные способы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2019, 01:37 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичЗадача 1: Как наиболее простым способом программно (не выделением пользователем) одной общей процедурой на все, ну например, добавить несколько "узлов" в "Ещё какие-нибудь параметры 4 2 0", а потом добавить ещё несколько в "Глобальные параметры 4", а потом ещё куда-нибудь. Ну суть, думаю, ясна. Код: pascal 1. 2. 3. 4. 5. 6. не понятно как выбрать узел второго уровня (1го если от 0) и так же не понятно как он работает с нулевым уровнем, так как, например Код: pascal 1. выделит не "Глобальные параметры 5", а "Локальные параметры 0 1" (ну по абсолютному индексу). Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Задача 2 (в принципе эта задача решается через Data, но вдруг ещё чего подскажите): Как при выделении пользователем любого узла получить привязанные к нему параметры однозначно и удобно его определяющие, наиболее удобно - индексы как те что после текста. Тут всё можно полностью через Data реализовать, думаю можно даже сами данные тогда в Data сохранять, а не в отдельных масивах, так что особо можно не мусолить, хотя если есть иные способы... Откуда берутся данные ? Если из Dataset то достаточно в Data загнать уникальный номер строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2019, 02:51 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, "задача 1" это не задача, а некое её решение. Задача - это то, что "задача" должна решать. При каких условиях "задача" возникает? В БД появились данные? Узел развернут пользователем? Какое-то иное внешнее событие? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2019, 07:52 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
DimaBrАндрей ИгоревичЗадача 1: Как наиболее простым способом программно (не выделением пользователем) одной общей процедурой на все, ну например, добавить несколько "узлов" в "Ещё какие-нибудь параметры 4 2 0", а потом добавить ещё несколько в "Глобальные параметры 4", а потом ещё куда-нибудь. Ну суть, думаю, ясна. ... Спасибо, вроде то, что нужно, ну точнее буду использовать это :). DimaBrЗадача 2 (в принципе эта задача решается через Data, но вдруг ещё чего подскажите): Как при выделении пользователем любого узла получить привязанные к нему параметры однозначно и удобно его определяющие, наиболее удобно - индексы как те что после текста. Тут всё можно полностью через Data реализовать, думаю можно даже сами данные тогда в Data сохранять, а не в отдельных масивах, так что особо можно не мусолить, хотя если есть иные способы... Откуда берутся данные ? Если из Dataset то достаточно в Data загнать уникальный номер строки. Данные берутся из текстовых файлов всевозможных форматов (там и списки настроек, и массивы всяких размерностей, форм и цветов, и просто текст). Пользователь просто щелкает слева по дереву (в дереве отображаются имена файлов, разделы файлов, подразделы) и видит нужную информацию (ну в общем, каждая вторая инженерная/научная расчетная программа имеет похожий интерфейс). Информацию я рисую в зависимости от названия файла (и, естественно, содержания) динамически генерируя на экране (на скролбаре) всякие разные менюшки, эдиты, лейблы, имейджи и прочее. wadmanАндрей Игоревич, "задача 1" это не задача, а некое её решение. Задача - это то, что "задача" должна решать. При каких условиях "задача" возникает? В БД появились данные? Узел развернут пользователем? Какое-то иное внешнее событие? Ну основное - в дереве показаны файлы настроек и разделы из них, пользователь подгрузил новый файл, надо добавить его и его разделы в дерево. Но в принципе я пока решил отказаться от такого и просто генерирую всё дерево заново при обновлении, так проще. Хотел тут куски кода привести, но подумал "не, гадостей наговорят, нафиг" :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2019, 12:38 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
Вы загружаете кучу файлов, которые затем отображаете в дереве. Вам нужно сопоставить узел с файлом. 1. Сопоставить по имени. 2. Загрузить все файлы в список, а в узел дерева (Data) записать номер по списку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2019, 13:43 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
DimaBrВы загружаете кучу файлов, которые затем отображаете в дереве. Вам нужно сопоставить узел с файлом. 1. Сопоставить по имени. 2. Загрузить все файлы в список, а в узел дерева (Data) записать номер по списку Сейчас реализовал по имени. Есть ещё несколько вопросов которые с нахрапу не могу в интернете найти, точнее решения разные есть, но не всегда уверен, что они корректны или подходят мне. 1. Как всё-таки корректно работать с Data. Пока я для пример сделал так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2019, 16:28 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, Так, я что-то нажал и оно отправилось. Как редактировать или удалять тут сообщения я не нашел, будем считать что того сообщения небыло :) DimaBrВы загружаете кучу файлов, которые затем отображаете в дереве. Вам нужно сопоставить узел с файлом. 1. Сопоставить по имени. 2. Загрузить все файлы в список, а в узел дерева (Data) записать номер по списку Сейчас реализовал по имени. Есть ещё несколько вопросов которые с нахрапу не могу в интернете найти, точнее решения разные есть, но не всегда уверен, что они корректны или подходят мне. 1. Как всё-таки корректно работать с Data? Тут я сделал вывод адреса файла в лейбел при клике по любому узлу. Правильно ли делаю, или я вообще всё не так делаю? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 2. Как пробежаться только по нулевому уровню дерева? Можно пробежаться по всему проверяя индекс, но как-то не спортивно... Блин, пока писал, забыл что ещё спросить хотел... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2019, 16:35 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
Вот пришел я к индексам через data к узлам и неожиданно возник вопрос: а как удобнее всего индексы то запоминать. Допустим у меня есть индексы узлов [1,0,0,0] [100500,0,0,0], для коневых, всякие [3,5,10,0] для для более глубоких узлов, как их сохранить то? Может есть общепринятый формат? Можно сохранить строкой - 3,5,10,0. Можно сохранить записью - Index = record; lvl1: byte; lvl2: byte; lvl3: byte; lvl4: byte; End; Может ещё как можно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2019, 11:41 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
Зачем вообще хранить длинные индексы ? Хотите хранить в узлах много дополнительных данных, заведите новый тип узла Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2019, 13:33 |
|
||
|
Treeview и удобный способ определения узлов?
|
|||
|---|---|---|---|
|
#18+
DimaBrЗачем вообще хранить длинные индексы ? Потому что так гораздо удобнее соотносить узел с конкретными данными (данных много и они разнородны, в узлы их засовывать сложно, да и не нужно). DimaBr Хотите хранить в узлах много дополнительных данных, заведите новый тип узла Много не надо, только индексы... Блин, а выше тут писали, что и Data хватит :). Теперь вот уже свой узел. Так дойдет что проще свой компонент написать будет (шутка, если что :)). При том и с Data что-то вообще не получается. Код: 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. 29. 30. 31. Вылетает с ошибкой на ошибку чтения из памяти, при том вылетает при завершении процедуры в которую вложен, индексы lv - даже 100 не не превышают. Да хоть нули - вылетает (но не всегда...). При замене на Код: pascal 1. 2. 3. 4. 5. 6. вообще пишет "Invalid typecast". В общем что-то как-то не могу, разобраться, в хелпе такой себе пример для понимания. Если не смогу понять, то попробую как вы предлагаете через свой узел DimaBr Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. А может вообще забью, в принципе через поиск всё работает, но уж больно мне не нравится код, где куча всяких циклов, условий и поисков, неудобный и ощибкоопасный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2019, 15:19 |
|
||
|
|

start [/forum/topic.php?fid=58&fpage=72&tid=2039435]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
49ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
81ms |
get tp. blocked users: |
2ms |
| others: | 254ms |
| total: | 437ms |

| 0 / 0 |
