powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как заполнить TreeView с произвольным количеством вложений?
25 сообщений из 29, страница 1 из 2
Как заполнить TreeView с произвольным количеством вложений?
    #32906141
w3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как заполнить TreeView с произвольным количеством вложений? У меня получается, что узел пытается добавиться в узел, который еще не создан - соответственно ошибка . В таблице структура ID, PARENTID, FOLD
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32906151
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ActiveX TreeView. Часто задаваемые вопросы. Часть I.
http://kodu.neti.ee/~juri4/vfpplus/ax_treeview_faq_01_ru.htm
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32906167
w3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочитал, не совсем понял, буду еще читать.
Вот как у меня сделано:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
******* заполняем группы ******************
SET FILTER TO ALLTRIM(gr)="Сборочные единицы" .and. sp_zapch.parentid= 0  .and. sp_zapch.id_nasosy=id_nas		&& сборочные единицы
	SCAN
		o.add("_2", 4 ,("_"+ALLTRIM(STR(id_detal))), ALLTRIM(descr+"("+chert_txt+")"), 1 , 2 )
	ENDSCAN
********************************************
******* заполняем группы ******************
SET FILTER TO ALLTRIM(gr)="Сборочные единицы" .and. sp_zapch.parentid<> 0  .and. sp_zapch.id_nasosy=id_nas		&& сборочные единицы
	SCAN
		o.add(("_"+ALLTRIM(STR(parentid))), 4 ,("_"+ALLTRIM(STR(id_detal))), ALLTRIM(descr+"("+chert_txt+")"), 1 , 2 )
	ENDSCAN
********************************************
т.е. в сборочных единицах могут быть еще сборочные единицы. На втором проходе и вылетает ошибка, т.к. узел еще не создан, он находится ниже по выборке.
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32906176
w3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В процессе работы возможны перемещения элементов между узлами.
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32906195
Фотография Диченка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дык ты введи дополнительное поле уровня иерархии. Например 0 - корневой узел, 1 - подчиненный и т.д., и перед построением дерева отсортируй таблицу по этому полю.
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32906230
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В твоем случае надо отсортировать таблицу по возрастанию ParentID (нужен индекс по этому полю)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select sp_zapch
SET ORDER TO ParentID
GO TOP
SCAN FOR ALLTRIM(gr)="Сборочные единицы" AND sp_zapch.id_nasosy=m.id_nas
	IF sp_zapch.parentid= 0 
	... 
	ELSE
	...
	ENDIF
ENDSCAN

Разумеется, индекс по ParentID должен быть создан заранее.
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32906258
w3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас попробую
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32906274
w3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМВ твоем случае надо отсортировать таблицу по возрастанию ParentID (нужен индекс по этому полю)
Разумеется, индекс по ParentID должен быть создан заранее.
Ни фига!
Вот что у меня получилось:
Код: plaintext
1.
2.
3.
ID       PARENTID
 5283     5254 
 5232     18480 
 5254     18480 
На первой же записи вылетает с ошибкой.
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32906299
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может это сгодится http://www.caws.atnet.ru/vfox/vfoxpro1.html
С уважением, Алексей.
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32906342
lo-pata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. По-моему, дерево с произвольным уровнем вложенности надо заполнять постепенно. Сначала загрузил все корневые (01_ т.е.) и по одному child узлу (0101_) к каждому (если child-ы есть конечно), когда открываешь любой узел - удаляешь загруженный подузел (0101_) и грузишь точно так же как вначале всех child-ов (0101_) и к каждому из них по одному подузлу (010101_) - и т.д. При таком методе экономится время и независимо от того, сколько ты грузишь узлов и какой уровень вложенности (количество узлов и уровень вложенности имеет тенденцию со временем расти по мере увеличения БД) - дерево грузится и открывается мгновенно.

2. Вот пример для такой таблички basa: поля key, parent, name, edizm - все Character
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Key	Parent	Name	            Edizm
01_	0_	Краски 	
0101_	01_	Фасадные	
010101_	0101_	DUFA	                    кг 
0103_	01_	Для внутр работ	
02_	0_	Кирпич	
010301_	0101_	Эмаль ПФ-115 белая	кг
и т.д. и т.п.
Код: plaintext
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.
this.imagelist = thisform.oimage && цепляем к дереву ImageList
thisform.lockscreen = .t.

select basa
set order to parent
go top
* все главные (корневые) узлы имеют значение поля parent "0_"
do while alltr(parent) = "0_"
	if alltr(parent) = "0_"
		this.nodes.add(,1,alltrim(key),left(key,2)+' '+ALLTRIM(name)+;
				iif(!empty(edizm),' ['+alltrim(edizm)+']',""),iif(mark=.t. ;
                               and !empty(edizm),4,1),iif(mark=.t. and !empty(edizm),5,2))
		lkey = key	
		vv = recno()
		set order to parent
		seek lkey
		* добавляем фиктивный подузел
		if found()
			this.nodes.add(alltrim(parent),4,alltrim(key),kod+' '+;
			ALLTRIM(name)+iif(!empty(edizm),' ['+alltrim(edizm)+']',""),1,2)
		endif
		set order to parent
		goto vv
	endif
	skip
ENDDO

thisform.lockscreen = .f.

На Expand дерева ставишь: удаление загруженного подузла, и точно так же, как грузил корневые узлы грузишь подузлы текущего. Одно отличие: вначале таблица сканерится пока parent='0_' - т.е. узлы корневые, здесь же ставишь такой же order находишь запись где parent=key текущего узла и сканеришь, пока выплняется это условие.

3. Чтобы не терять время - ставишь проверку на количество узлов у текущего. Если 1 - тогда все как п.2, если >1 - значит подузлы уже загружались и ничего больше делать не надо.
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32906344
w3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-KМожет это сгодится http://www.caws.atnet.ru/vfox/vfoxpro1.html
С уважением, Алексей.
Спасибо, но это немного не то
10-й час за компом, голова вообще не варит....

Если сделать такой алгоритм:
1. Отобрать записи PID=0
2. Для каждой записи (ii=ID)
- записать в tree
- Отобрать записи с PID=ii
- записать в tree
- Отобрать записи с PID=kk
.......
Только вот как остановиться?
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32906351
w3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lo-pata



Сейчас постараюсь разобраться
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32906353
lo-pata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А про сортуровку таблицы - оч правильно говорили, обрати внимание на order
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32906359
w3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lo-pataА про сортуровку таблицы - оч правильно говорили, обрати внимание на order
см. выше - сортировка не помогает
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32906379
w3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lo-pata


Мне надо, чтобы узлы переносились в процессе работы. Перенес - узел стоит на новом месте, выделенный. Так все и работало, пока не наткнулся на недостаток алгоритма - иногда пытаетсся записать в еще не созданный узел. Теперь рассматриваю постепенное заполнение.
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32906389
lo-pata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как может писаться в еще не созданный узел? При создании узла всегда надо указать кто ему parent, иначе как его добавлять, куда? Это же основа построения дерева - от корневых и вглубь. Так что проанализируй механизм добавления.
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32906410
w3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lo-pataКак может писаться в еще не созданный узел?
вот и вылетает ошибка
lo-pataТак что проанализируй механизм добавления.
вот и анализирую
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32906414
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, опять поторопился. В "классической" схеме ID, ParentID вобщем случае невозможно создать нужный порядок сортировки при помощи индекса.

При такой структуре заполнение осуществляется через рекурсию или вложенные циклы. Сначала все корневые узлы (ParentID=0), потом все узлы для первого созданного, потом все узлы для первого от первого созданного и т.п.

Хотя, обычно, никто и не строит сразу все дерево. Физически строится только то, что пользователь видит. Построение узла происходит только в момент его раскрытия. Да и то, только первый отображаемый уровень.
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32906423
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитай здесь

http://forum.foxclub.ru/read.php?f=5&i=52997&t=52905

Там приведены ссылки на другие схемы хранение "древовидных структур"
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32906437
w3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМПочитай здесь

http://forum.foxclub.ru/read.php?f=5&i=52997&t=52905

Там приведены ссылки на другие схемы хранение "древовидных структур"

да не грузится у меня фоксклуб. на шлюзе работает, у меня - нет, почему - хз.
Пошел я до дому, там буду думать.
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32907090
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi w3d!

Если ты хочешь "всё и сразу" заполнить (замечу что мне обычно это кажется
неразумным делать) - то надо таким образом упорядочить твою таблицу, чтобы
там "узлы" находились перед "листьями" - в общем случае это кстати весьма
непросто сделать :(
Однако если ты откажешься от полного заполнения дерева, а заполнишь только
первый уровень (взяв узлы у которых Parent = 0 или NULL или как ты там это
организовал), а в Child каждому поместишь фиктивный узел. И в Expand будешь
удалят этот фиктивный узел, запрашивать из таблицы список "детей" ТОЛЬКО для
соответствующего узла (его ID ты скорее всего так или иначе "интегрировал" в
Node.Key, потому "достать" его не проблема) и динамически дополнять дерево,
то ты решишь и изначальную проблему, и заодно избавишься от тормозов при
создании дерева (а они будут если там число узлов перевалит за несколько
тысяч).
AFAIK тема динамического заполнения дерева хорошо освещена - поищи и
обязательно найдёшь даже примеры кода.

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32907131
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Диченко!

Вводя подобное поле, ты нарушаешь принципы нормализации данных, и получаешь
КУЧУ проблем при обновлении данных - вот например перетянули узел с 3-го
уровня на 1-й - и пошло в цикле (или рекурсии - это неважно) "обновление"
этого поля и для перемещённого узла, и для всех его потомков...
В общем очень спорное решение, слишком уж много минусов.

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32907273
w3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ


На фоксклубе нашел:
>>По этому поводу есть очень красивое решение из книги "Visual FoxPro 6. Разработка корпоративных приложений" Род Педдок и др.

Это решение оформлено в виде класса ActiveX.VCX

Передаешь туда в виде параметра таблицу или курсор со следующей структурой:

PrimaryKey C(10) - код записи
ParentKey C(10) - ссылка на родителя (код записи из этой же таблицы)
Description C(30) - текст элемента

И получаешь готовое дерево в OleTreeView<<

Там приведена ссылка, но она не работает. Где еще можно это взять?
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32907332
w3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Expand стоит такой код:
Код: plaintext
1.
MESSAGEBOX("kk="+kk)
		thisform.Olecontrol1.add(kk, 4 ,("_"+ALLTRIM(STR(id_detal))), ALLTRIM(descr+"("+chert_txt+")"),cc,dd)
kk-key узла, который выделен,
выдается правильно, а на добавление ругается... что не так?
...
Рейтинг: 0 / 0
Как заполнить TreeView с произвольным количеством вложений?
    #32907426
w3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выдается "OLE error code 0x80020006: Неизвестное имя"
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как заполнить TreeView с произвольным количеством вложений?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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