powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Вопрос по TreeView
8 сообщений из 8, страница 1 из 1
Вопрос по TreeView
    #37231277
Даниэль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток. Вопрос по поиску в дереве: нужно для конкретного родителя сделать "пробежку" по всем детям, не трогая внуков, правнуков и т.д.
Мой вариант:

LOCAL _cnt, i, _Node, _Child, _str
_Node = ThisForm.TreeKladr.Nodes(_SEARCH).Parent && ссылка на родителя, (находится правильно)
_cnt = _Node.Children && количество детей, (в тестовом варианте дает 180 детей)
_Child = _Node.Child && первый ребенок (ссылку дает на "правильного" ребенка, первого в списке
_str = "КА" && строка для поиска
FOR i = 1 TO _cnt
IF _str = UPPER(ALLTRIM(_Child.Text))
=MESSAGEBOX('Found - '+_Child.Text)
EXIT
ENDIF
_Child = _Node.Next && вот тут возникает ошибка: _Node.Next равен .NULL.
ENDFOR

Может я не допонял свойство Next? Мне бы хотелось чтобы это свойство давало следующего ребенка. Или у меня подозрение в том что цикл FOR...ENDFOR тут неуместен: нужно искать детей у конкретного родителя через DO WHILE...ENDDO, то есть "шариться" по всему дереву и искать тех детей, у кого "конкретный" родитель
...
Рейтинг: 0 / 0
Вопрос по TreeView
    #37231294
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проще хранить данные в таблице/курсоре и там с ними работать. А дерево использовать только для отображения данных.
Так обработка будет значительно быстрее и дерево при открытии можно будет не наполнять целиком, а подгружать нужные ветки при их открытии.

PS Имена переменных начинать с подчеркивания не советую, т.к. в фоксе есть набор служебных переменных и все они начинаются с подчеркивания.
...
Рейтинг: 0 / 0
Вопрос по TreeView
    #37237475
Marina N.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

можно попробовать так:

* Создаем временный курсор для хранения все вершин дерева
* естественно, типы и размерность полей - какие вам нужны

CREATE CURSOR FullTree (NodeKey C(10), ParentNodeKey C(10), NodeText CHAR(50))

* заполняем этот курсор (если надо, применяем ALLTRIM, UPPER, LOWER и т.п.)

FOR i = 1 TO ThisForm.TreeKladr.Nodes.Count
INSERT INTO FullTree VALUES(ThisForm.TreeKladr.Nodes(i).Key, ;
ThisForm.TreeKladr.Nodes(i).Parent.Key, ThisForm.TreeKladr.Nodes(i).Text)
ENDFOR

* Выбираем из полученного курсора все вершины,
* с заданным родителем и свойством .TEXT равным искомой строке

SELECT * FROM FullTree ;
WHERE FullTree.ParentNodeKey = _Node AND ;
UPPER(ALLTRIM(_Child.Text)) = _str
INTO CURSOR OnlyFoundChildren
...
Рейтинг: 0 / 0
Вопрос по TreeView
    #37237703
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marina N.Dima T,

можно попробовать так:

* Создаем временный курсор для хранения все вершин дерева
* естественно, типы и размерность полей - какие вам нужны

CREATE CURSOR FullTree (NodeKey C(10), ParentNodeKey C(10), NodeText CHAR(50))

* заполняем этот курсор (если надо, применяем ALLTRIM, UPPER, LOWER и т.п.)

FOR i = 1 TO ThisForm.TreeKladr.Nodes.Count
INSERT INTO FullTree VALUES(ThisForm.TreeKladr.Nodes(i).Key, ;
ThisForm.TreeKladr.Nodes(i).Parent.Key, ThisForm.TreeKladr.Nodes(i).Text)
ENDFOR
...
Можно по всякому попробовать, например проделать это с деревом в 5-10 тысяч узлов и потом объяснять юзеру что тормоза из-за того что справочник у него сильно большой. Кроме того дерево должно быть предварительно заполнено целиком, что еще медленнее будет чем этот код.

Чтобы тормозов не было - дерево должно только отображать данные. Самый быстрый способ такой: при старте показывается только узлы первого уровня, при попытке пользователем открыть узел - добавляются только его дочерние узлы. Крайне редко пользователю надо видеть все дерево в развернутом виде, а при таком подходе получается что реально в дереве 100-200 узлов.
И не надо назначать дерево "передастом", т.е. сначала писать туда а потом читать из него, гораздо быстрее прочитать напрямую из базы.
...
Рейтинг: 0 / 0
Вопрос по TreeView
    #37237780
Marina N.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

Э-э... ошибочка вышла. Мой первый ответ предназначался не Вам, а Даниэлю. Sorry!

А Ваши замечания, конечно, верны.
Но только, вопрос, - по какой-то причине, известной только
автору, - был именно о дереве. Бог весть, как оно создается.
С чего Вы взяли, что там вообще есть для этого таблица?
И почему это дерево обязательно большое?
Я предлагаю вариант, а подойдет он автору темы или нет– это уж ему решать.
...
Рейтинг: 0 / 0
Вопрос по TreeView
    #37237975
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marina N.С чего Вы взяли, что там вообще есть для этого таблица?
Даже если ее нет, то можно создать курсор вместо изначального наполнения дерева.
Marina N.И почему это дерево обязательно большое?
Даниэль...
_cnt = _Node.Children && количество детей, (в тестовом варианте дает 180 детей)
...
Думаю немаленькое если у одного узла 180 дочерних.

PS Топикстартер за 3 дня не объявился, наверно уже решил свою проблему по принципу "лишь бы работало".
PPS По собственному опыту могу сказать что написанное по принципу "лишь бы работало" через некоторое время приводит к тому приходится это место переписывать с нуля и зачастую править код связанный с этим.
...
Рейтинг: 0 / 0
Вопрос по TreeView
    #37238308
Marina N.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не смешно. Проблемка автора вопроса заключалась в том, что цикл у него должен быть

FOR i =1 TO _cnt-1

Одного "ребятенка" он уже посчитал как CHILD, стало быть обойти осталось CHILDREN - 1.
...
Рейтинг: 0 / 0
Вопрос по TreeView
    #37254216
Даниэль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

да я так и сделал. Ищу имя в таблице, а в дереве делаю видимым и раскрытым. Формирую "детей" по мере нажатия на "+".
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Вопрос по TreeView
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]